/ Hex Artifact Content
Login

Artifact 5905cbd1436d36908cf68a42145a43efb650ac34:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5000: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
5010: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5020: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5040: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5050: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5060: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5070: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5080: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5090: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
50a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
50b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
50c0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
50d0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
50e0: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
50f0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
5100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
5110: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
5120: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
5130: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5140: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5150: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5160: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
5170: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5180: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5190: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
51a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
51b0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
51c0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
51d0: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
51e0: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
51f0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5200: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5210: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5220: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5230: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5240: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5250: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5260: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
5270: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5280: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5290: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
52a0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
52b0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
52c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
52d0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
52e0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
52f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5300: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5320: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5350: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5380: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5390: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
53a0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
53b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
53c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
53d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
53e0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
53f0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
5400: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5410: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5420: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
5430: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5440: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5450: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5460: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5470: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5480: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5490: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
54a0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
54b0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
54c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
54d0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
54e0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
54f0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5500: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5510: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5520: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5530: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5540: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5550: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5560: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5570: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5580: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5590: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
55a0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
55b0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
55c0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
55d0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
55e0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
55f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5600: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5610: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5620: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5630: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5640: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5650: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5660: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5670: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5680: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5690: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
56a0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
56b0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
56c0: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
56d0: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
56e0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
56f0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5700: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5710: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5720: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
57a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
57c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
57d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
57e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
57f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5840: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5850: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5860: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5870: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5890: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
58a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
58b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
58c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
58d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
58e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
58f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
5900: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
5910: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
5920: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
5930: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
5940: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5950: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5960: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5970: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5980: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5990: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
59a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
59b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
59c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
59d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
59e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
59f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
5a00: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
5a10: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
5a20: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
5a30: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
5a40: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
5a50: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
5a60: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
5a70: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
5a80: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
5a90: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
5aa0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
5ab0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
5ac0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5ad0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5ae0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
5af0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
5b00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5b10: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
5b20: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
5bb0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
5bc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
5bd0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5be0: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
5c00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
5c10: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
5c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
5c40: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5c50: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5c60: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5c70: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5c80: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5c90: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5ca0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5cc0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5cd0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5ce0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5cf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
5d00: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
5d10: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
5d20: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
5d30: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
5d40: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5d50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5d60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5d70: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5d80: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5d90: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5da0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5db0: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5dc0: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5dd0: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5de0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
5df0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
5e00: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
5e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5e20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
5e30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
5e40: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5e50: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5e60: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5e80: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5e90: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5ea0: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5eb0: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5ec0: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5ed0: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5ee0: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
5ef0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
5f00: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
5f10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
5f20: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f40: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5f50: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5f60: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5f70: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5f80: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5f90: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
5fa0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5fb0: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5fc0: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5fd0: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5fe0: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
5ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6000: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6010: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6020: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6030: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6040: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
6050: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
6060: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6070: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6080: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6090: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
60b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
60d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
60e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
60f0: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6100: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6120: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6130: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
6140: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6180: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
61a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
61b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
61c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
61d0: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
61e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
61f0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6200: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
6210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6220: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6230: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6240: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6250: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6260: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6270: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6280: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6290: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
62a0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
62b0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
62c0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
62d0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
62e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
62f0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6300: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6310: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6320: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6330: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
6340: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
6350: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6370: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6380: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
6390: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
63a0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
63b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
63c0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
63d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
63e0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
63f0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6400: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6410: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6420: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6430: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6440: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6450: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6460: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6470: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6480: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6490: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
64a0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
64b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
64c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
64d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
64e0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
64f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6500: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6510: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6530: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6540: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6550: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6560: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6570: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6580: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6590: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
65a0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
65b0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
65c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65d0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
65e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
65f0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6600: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6610: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6620: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6630: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6640: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6650: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6660: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6670: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6680: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6690: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
66a0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
66b0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
66c0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
66d0: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
66e0: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
66f0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6700: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6710: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6720: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6730: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6750: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6760: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6770: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6790: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
67a0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
67b0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
67c0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
67d0: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
67e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
67f0: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6800: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6810: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6820: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6830: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6850: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6860: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6870: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6880: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6890: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
68a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
68c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
68d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
68e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
68f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6900: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6910: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6920: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6930: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6940: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6950: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6960: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6970: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6980: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6990: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
69a0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
69b0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
69c0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
69d0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
69e0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
69f0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
6a00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
6a10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
6a20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
6a30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
6a40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
6a50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
6a60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
6a70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
6a90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
6aa0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
6ac0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
6ad0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6ae0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
6af0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6b00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
6b10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
6b20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
6b30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
6b70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
6b80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6ba0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
6bb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
6bc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6bd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6be0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
6bf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
6c00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
6c10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6c20: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
6c30: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
6c40: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6c80: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
6c90: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
6ca0: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
6cb0: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
6cc0: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
6cd0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
6ce0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
6cf0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6d00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
6d10: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
6d20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
6d30: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
6d40: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
6d50: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
6d60: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
6d70: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
6d80: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
6d90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6da0: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
6db0: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
6dc0: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
6dd0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
6de0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
6df0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
6e00: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
6e10: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
6e20: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
6e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6e60: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
6e70: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
6e80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
6e90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
6ea0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
6eb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
6ec0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
6ed0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
6ee0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
6ef0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
6f00: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6f10: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
6f20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6f30: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
6f40: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
6f50: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
6f60: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
6f70: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
6f80: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6f90: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
6fa0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
6fb0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
6fc0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
6fd0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6fe0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
6ff0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
7000: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
7010: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
7020: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7030: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
7040: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7050: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7060: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7070: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7080: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
70a0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
70b0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
70c0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
70d0: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
70e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
70f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7100: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7110: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7120: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7130: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7140: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7150: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7160: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7190: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
71a0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
71c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
71d0: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
71e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
71f0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7210: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7220: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7230: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7240: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7250: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7260: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7270: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7280: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7290: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
72a0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
72b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
72c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
72d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
72e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
72f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7310: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7320: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7340: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7350: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7360: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7370: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7380: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
73b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
73c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
73d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
73e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
73f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7400: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7440: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7450: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7460: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7470: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7480: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7490: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
74a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
74b0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
74c0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
74d0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
74e0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
74f0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7500: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7510: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7520: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7540: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7550: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
7560: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
7570: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7580: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
7590: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
75a0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
75b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75d0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
75e0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7600: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
7610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7620: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
7630: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
7640: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
7650: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7660: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
7670: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
7680: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7690: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
76a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
76b0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
76c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
76e0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
76f0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7700: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
7710: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
7720: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
7750: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7760: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7770: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
7780: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7790: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
77a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
77b0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
77c0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
77d0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
77e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
77f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7810: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
7820: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7830: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7850: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
7860: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
7870: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
7880: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
7890: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
78a0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
78b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
78c0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
78d0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
78e0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
78f0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7900: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
7910: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7920: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
7930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7940: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
7950: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7960: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7970: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
7980: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
7990: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
79a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
79b0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
79c0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
79d0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
79e0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
79f0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
7a00: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
7a10: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
7a20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a50: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
7a60: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
7a70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
7a80: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
7a90: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
7aa0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
7ab0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
7ac0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
7ad0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
7ae0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
7af0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
7b00: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
7b10: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
7b20: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
7b30: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
7b40: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
7b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
7b60: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
7b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7b80: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
7b90: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
7bb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
7bc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
7bd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7be0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
7bf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
7c00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
7c10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
7c20: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
7c30: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
7c40: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
7c50: 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28  ellv2(D,M,O,I) (
7c60: 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b  D+(M&get2byte(D+
7c70: 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f  (O+2*(I))))).../
7c80: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
7c90: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
7ca0: 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74   of findCell() t
7cb0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
7cc0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
7cd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7ce0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
7cf0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
7d00: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
7d10: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
7d20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
7d30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7d40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7d50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7d60: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
7d70: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
7d80: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
7d90: 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e  .    k = pPage->
7da0: 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69  aiOvfl[i];.    i
7db0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
7dc0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
7dd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
7de0: 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  urn pPage->apOvf
7df0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l[i];.      }.  
7e00: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7e20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7e30: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7e40: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
7e50: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
7e60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
7e70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
7e80: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
7e90: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
7ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74  is function.  bt
7eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
7ec0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
7ed0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
7ee0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
7ef0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7f00: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
7f10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7f20: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
7f30: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
7f40: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7f50: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f60: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7f70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7f80: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7f90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7fa0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fc0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
7fd0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
7fe0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8000: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8010: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
8020: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
8030: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
8040: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
8050: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8060: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8070: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8080: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
8090: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
80a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
80b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
80c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
80d0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
80e0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
80f0: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
8100: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
8110: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8120: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8130: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 72 20  =0 );.    pIter 
8140: 3d 20 70 43 65 6c 6c 20 2b 20 67 65 74 56 61 72  = pCell + getVar
8150: 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61  int32(pCell, nPa
8160: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 74 65  yload);.    pIte
8170: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70  r += getVarint(p
8180: 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e  Iter, (u64*)&pIn
8190: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
81a0: 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f  se if( pPage->no
81b0: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61  Payload ){.    a
81c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
81d0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
81e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
81f0: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8200: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8210: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8220: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ;.    pInfo->nPa
8230: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70  yload = 0;.    p
8240: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
8250: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
8260: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
8270: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
8280: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
8290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
82a0: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
82b0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
82c0: 65 3b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e;.    pIter += 
82d0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
82e0: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
82f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
8300: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
8310: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8320: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
8330: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
8340: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
8350: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
8360: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8370: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
8380: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
8390: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
83a0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
83b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
83c0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
83d0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
83e0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
83f0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
8400: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
8410: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
8420: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
8430: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
8440: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8450: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
8460: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
8470: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
8480: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
8490: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
84a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
84b0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
84c0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
84d0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
84e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
84f0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8500: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
8510: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8520: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
8530: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
8540: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
8550: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
8560: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
8570: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
8580: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8590: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
85a0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
85b0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
85c0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
85d0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
85e0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
85f0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
8600: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
8610: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
8620: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
8630: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
8640: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
8650: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
8660: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
8670: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
8680: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
8690: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
86a0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
86b0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
86c0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
86d0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
86e0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
86f0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8700: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
8710: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
8720: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
8730: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8740: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
8750: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
8760: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
8770: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
8780: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
8790: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
87a0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
87b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
87c0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
87d0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
87e0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
87f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8800: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8810: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8820: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8830: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
8840: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8850: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
8860: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
8870: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
8880: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8890: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
88a0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
88b0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
88c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
88d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
88e0: 6c 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e  low = (u16)(&pIn
88f0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8900: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8910: 65 6c 6c 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  ell);.    pInfo-
8920: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
8930: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
8940: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
8950: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8960: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8970: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8980: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8990: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
89a0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
89b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
89c0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
89d0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
89e0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
89f0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8a00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8a10: 2f 0a 29 7b 0a 20 20 62 74 72 65 65 50 61 72 73  /.){.  btreePars
8a20: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8a30: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8a40: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
8a60: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
8a70: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8a80: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8a90: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8aa0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8ab0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8ac0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8ad0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8ae0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8af0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8b00: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8b10: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
8b20: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
8b30: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
8b40: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8b50: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
8b60: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8b70: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8b80: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
8b90: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
8ba0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
8bb0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
8bc0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
8bd0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
8c00: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
8c10: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
8c20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
8c50: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
8c60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8c70: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
8c80: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
8c90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
8ca0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
8cb0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
8cc0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
8cd0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
8ce0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
8cf0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
8d00: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
8d10: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
8d20: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
8d30: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
8d40: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
8d50: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
8d60: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
8d70: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
8d80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
8d90: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
8da0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
8db0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
8dc0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
8dd0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61   if( pPage->noPa
8de0: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 45 6e  yload ){.    pEn
8df0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8e00: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8e10: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
8e20: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 61  er<pEnd );.    a
8e30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8e40: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 75 31 36  .    return (u16
8e60: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8e70: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20  ;.  }.  nSize = 
8e80: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
8e90: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
8ea0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
8eb0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
8ec0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8ed0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
8ee0: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
8ef0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f00: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
8f10: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
8f20: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
8f30: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
8f40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8f50: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
8f60: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
8f70: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
8f80: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
8f90: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
8fa0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8fb0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
8fc0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
8fd0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
8fe0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
8ff0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9000: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
9010: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
9020: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
9030: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
9040: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9050: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
9060: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9070: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9080: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
9090: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
90a0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
90b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
90c0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
90d0: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
90e0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
90f0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
9100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
9110: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
9120: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
9130: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
9140: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
9150: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
9160: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9170: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
9180: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
9190: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
91b0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
91c0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
91d0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
91e0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
91f0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
9200: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
9210: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
9220: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9230: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
9240: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
9250: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
9260: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
9270: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
9280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9290: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
92a0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
92b0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
92c0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
92d0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
92e0: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
92f0: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
9300: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9310: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
9320: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9330: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9340: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
9350: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
9360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9370: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
9380: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
9390: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
93a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
93b0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
93c0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
93d0: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
93e0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
93f0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
9400: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
9410: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
9420: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
9430: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
9440: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
9450: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
9460: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
9470: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
9480: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
9490: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
94a0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
94b0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
94c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
94d0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
94e0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
94f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
9500: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
9510: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
9520: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
9530: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
9540: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
9550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
9560: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
9570: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
9580: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
9590: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
95a0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
95b0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
95c0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
95d0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
95e0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
95f0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
9600: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
9610: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
9620: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
9630: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
9640: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
9650: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
9660: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
9670: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
9680: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
9690: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
96a0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
96b0: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
96c0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
96d0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
96e0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
96f0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
9700: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
9710: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
9720: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
9730: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
9740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9750: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
9760: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
9770: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9790: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
97a0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
97c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
97d0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
97e0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
97f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9800: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
9810: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
9820: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
9830: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9840: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
9850: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
9860: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9870: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
9880: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
9890: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
98b0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
98c0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
98d0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98f0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
9900: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9910: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
9920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9930: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9940: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
9950: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9960: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
9970: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
9980: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
9990: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
99a0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
99b0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
99c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
99d0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
99e0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
99f0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
9a00: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
9a10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
9a20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
9a30: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
9a40: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
9a50: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
9a60: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9a70: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
9a80: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9a90: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9aa0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9ab0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ad0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9ae0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
9af0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
9b00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9b10: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
9b20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9b40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9b50: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
9b60: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
9b70: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
9b80: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9b90: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
9ba0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
9bb0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
9bc0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
9bd0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
9be0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
9bf0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
9c00: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
9c10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9c20: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
9c30: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
9c40: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
9c50: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
9c60: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
9c70: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
9c80: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
9c90: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
9ca0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
9cb0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
9cc0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
9cd0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9ce0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
9cf0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
9d00: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d10: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
9d20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d30: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
9d40: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
9d50: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
9d60: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
9d70: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
9d80: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
9d90: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
9da0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
9db0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
9dc0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
9dd0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
9de0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9df0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9e00: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
9e10: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
9e20: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
9e30: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
9e40: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
9e50: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
9e60: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
9e70: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
9e80: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
9e90: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
9ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9eb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
9ed0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9ee0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9ef0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9f00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9f10: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9f20: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9f30: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9f40: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9f50: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9f60: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
9f70: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
9f80: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
9f90: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
9fa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
9fb0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
9fc0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
9fd0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
9fe0: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
9ff0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
a000: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
a010: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
a020: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
a030: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
a040: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
a050: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
a060: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
a070: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
a080: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
a090: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
a0a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
a0b0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
a0c0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
a0d0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
a0e0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
a0f0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
a100: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
a110: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
a120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a130: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a140: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a150: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
a160: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
a170: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
a180: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a190: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a1a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a1b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
a1c0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
a1d0: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
a1e0: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
a1f0: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
a200: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
a210: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
a220: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
a230: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
a240: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
a250: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
a260: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
a270: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
a280: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
a290: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
a2a0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
a2b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
a2c0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
a2d0: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
a2e0: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
a2f0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
a300: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
a310: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
a320: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
a330: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
a340: 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20  ** If a slot of 
a350: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
a360: 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75  ytes is found bu
a370: 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
a380: 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65   because .** the
a390: 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  re are already a
a3a0: 74 20 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d  t least 60 fragm
a3b0: 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74  ented bytes on t
a3c0: 68 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  he page, return 
a3d0: 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73  NULL..** In this
a3e0: 20 63 61 73 65 2c 20 69 66 20 70 62 44 65 66 72   case, if pbDefr
a3f0: 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ag parameter is 
a400: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70  not NULL, set *p
a410: 62 44 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e  bDefrag to true.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70  .*/.static u8 *p
a430: 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50  ageFindSlot(MemP
a440: 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42  age *pPg, int nB
a450: 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69  yte, int *pRc, i
a460: 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20  nt *pbDefrag){. 
a470: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
a480: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
a490: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
a4a0: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
a4b0: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20  ;.  int iAddr;. 
a4c0: 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75   int pc;.  int u
a4d0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
a4e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a4f0: 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68  ;..  for(iAddr=h
a500: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
a510: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
a520: 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63  r]))>0; iAddr=pc
a530: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
a540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a550: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
a560: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
a570: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
a580: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
a590: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
a5a0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
a5b0: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
a5c0: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
a5d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
a5e0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
a5f0: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
a600: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
a610: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a620: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a630: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
a640: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
a650: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
a660: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
a670: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
a680: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
a690: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
a6a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a6b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
a6c0: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
a6d0: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
a6e0: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
a6f0: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
a700: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
a710: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
a720: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
a730: 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
a740: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
a750: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
a760: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
a770: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
a780: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
a790: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
a7a0: 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35  CE-OF: R-11498-5
a7b0: 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66  8022 In a well-f
a7c0: 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
a7d0: 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20  e, the total.   
a7e0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f       ** number o
a7f0: 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d  f bytes in fragm
a800: 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63  ents may not exc
a810: 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20  eed 60. */.     
a820: 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72     if( aData[hdr
a830: 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20  +7]>=60 ){.     
a840: 20 20 20 20 20 69 66 28 20 70 62 44 65 66 72 61       if( pbDefra
a850: 67 20 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20  g ) *pbDefrag = 
a860: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  1;.          ret
a870: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
a880: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
a890: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
a8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
a8b0: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
a8c0: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
a8d0: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
a8e0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
a8f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
a900: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
a910: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
a920: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
a930: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
a940: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a950: 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c  ( pc < pPg->cell
a960: 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43  Offset+2*pPg->nC
a970: 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e  ell || size+pc >
a980: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
a990: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
a9a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a9b0: 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  T;.        retur
a9c0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
a9d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
a9e0: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
a9f0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
aa00: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
aa10: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
aa20: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
aa30: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
aa40: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
aa50: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  n. */.        pu
aa60: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
aa70: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d  +2], x);.      }
aa80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61  .      return &a
aa90: 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20  Data[pc + x];.  
aaa0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
aab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
aac0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
aad0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
aae0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
aaf0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
ab00: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
ab10: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
ab20: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
ab30: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
ab40: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
ab50: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
ab60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
ab70: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
ab80: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
ab90: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
aba0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
abb0: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
abc0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
abd0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
abe0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
abf0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
ac00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
ac10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
ac20: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
ac30: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
ac40: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
ac50: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
ac60: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
ac70: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
ac80: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
ac90: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
aca0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
acb0: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
acc0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
acd0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
ace0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
acf0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
ad00: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
ad10: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
ad20: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
ad30: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
ad40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ad50: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
ad60: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ad70: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
ad80: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
ad90: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ada0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
adb0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
adc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
add0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
ade0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
adf0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
ae00: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ae10: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
ae20: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
ae50: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
ae60: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
ae70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae90: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
aea0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
aeb0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
aec0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
aed0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
aee0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
aef0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
af00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
af10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
af20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
af30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
af40: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
af50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
af60: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
af70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
af80: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
af90: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
afa0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
afb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
afc0: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
afd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
afe0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
aff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
b000: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
b010: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b020: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
b030: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
b040: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
b050: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
b060: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
b070: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
b080: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
b090: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
b0a0: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
b0b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
b0c0: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
b0d0: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
b0e0: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
b0f0: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
b100: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
b110: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
b120: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
b130: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
b140: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
b150: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
b160: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
b170: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
b180: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
b190: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
b1a0: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
b1b0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
b1c0: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
b1d0: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
b1e0: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
b1f0: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
b200: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
b210: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
b220: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
b230: 20 67 61 70 3e 74 6f 70 20 7c 7c 20 28 75 33 32   gap>top || (u32
b240: 29 74 6f 70 3e 70 50 61 67 65 2d 3e 70 42 74 2d  )top>pPage->pBt-
b250: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
b260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b270: 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
b280: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
b290: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
b2a0: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
b2b0: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
b2c0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
b2d0: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
b2e0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
b2f0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
b300: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
b310: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
b320: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
b330: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
b340: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
b350: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
b360: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b370: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
b380: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
b390: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
b3a0: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
b3b0: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20  ( gap+2<=top && 
b3c0: 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20  (data[hdr+1] || 
b3d0: 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a  data[hdr+2]) ){.
b3e0: 20 20 20 20 69 6e 74 20 62 44 65 66 72 61 67 20      int bDefrag 
b3f0: 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a 70 53 70  = 0;.    u8 *pSp
b400: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
b410: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
b420: 20 26 72 63 2c 20 26 62 44 65 66 72 61 67 29 3b   &rc, &bDefrag);
b430: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
b440: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
b450: 20 62 44 65 66 72 61 67 20 29 20 67 6f 74 6f 20   bDefrag ) goto 
b460: 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67 65 3b  defragment_page;
b470: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
b480: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b490: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
b4a0: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
b4b0: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
b4c0: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
b4d0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
b4e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b4f0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
b500: 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73  .  /* The reques
b510: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  t could not be f
b520: 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61  ulfilled using a
b530: 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20   freelist slot. 
b540: 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   Check.  ** to s
b550: 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74  ee if defragment
b560: 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
b570: 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ry..  */.  testc
b580: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
b590: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
b5a0: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
b5b0: 7b 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  {. defragment_pa
b5c0: 67 65 3a 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge:.    assert( 
b5d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
b5e0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
b5f0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
b600: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
b610: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
b620: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
b630: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b640: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b650: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
b660: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
b670: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
b680: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
b690: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
b6a0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
b6b0: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
b6c0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
b6d0: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
b6e0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
b6f0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
b700: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
b710: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
b720: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
b730: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
b740: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
b750: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
b760: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
b770: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
b780: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
b790: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
b7a0: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
b7b0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
b7c0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
b7d0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
b7e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b7f0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
b800: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
b810: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
b820: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
b830: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
b840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b860: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
b870: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
b880: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
b890: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
b8a0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
b8b0: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
b8c0: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
b8d0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
b8e0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
b8f0: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
b900: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
b910: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
b920: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
b930: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
b940: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
b950: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
b960: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
b970: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
b980: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
b990: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
b9a0: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
b9b0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
b9c0: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
b9d0: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
b9e0: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
b9f0: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
ba00: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
ba10: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ba20: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
ba30: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
ba40: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
ba50: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
ba60: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
ba70: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
ba80: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
ba90: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
baa0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
bab0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
bac0: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
bad0: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
bae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb00: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
bb10: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
bb20: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
bb30: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb50: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
bb60: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
bb70: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bba0: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
bbb0: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
bbc0: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
bbf0: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
bc00: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
bc10: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bc30: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
bc40: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
bc50: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
bc60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
bc70: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
bc80: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
bc90: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
bca0: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
bcb0: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
bcc0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
bcd0: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
bce0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
bcf0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
bd00: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
bd10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
bd20: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
bd30: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
bd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bd50: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
bd60: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
bd70: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
bd80: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
bd90: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
bda0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
bdb0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
bdc0: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
bdd0: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
bde0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
bdf0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
be00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
be10: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
be20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
be30: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
be40: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
be50: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
be60: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
be70: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
be80: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
be90: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
bea0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
beb0: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
bec0: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
bed0: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
bee0: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
bef0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
bf00: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
bf10: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
bf20: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
bf30: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
bf40: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
bf50: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
bf60: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
bf70: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
bf80: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
bf90: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
bfa0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
bfb0: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
bfc0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
bfd0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
bfe0: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
bff0: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
c000: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
c010: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
c020: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
c030: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
c040: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
c050: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
c060: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
c070: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
c080: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30  (&data[iPtr]))>0
c090: 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74   && iFreeBlk<iSt
c0a0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
c0b0: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
c0c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c0d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c0e0: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
c0f0: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
c100: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
c110: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
c120: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c130: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
c140: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
c150: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
c160: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c170: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
c180: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
c190: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
c1a0: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
c1b0: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
c1c0: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
c1d0: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
c1e0: 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42 6c   pointer iFreeBl
c1f0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
c200: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c210: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
c220: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
c230: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
c240: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
c250: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
c260: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
c270: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
c280: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
c290: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
c2a0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
c2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c2c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
c2d0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
c2e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c2f0: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
c300: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
c310: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
c320: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
c330: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c340: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
c350: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
c360: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
c370: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
c380: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
c390: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
c3a0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
c3b0: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
c3c0: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
c3d0: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
c3e0: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
c3f0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
c400: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
c410: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
c420: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
c430: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
c440: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
c450: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
c460: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
c470: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
c480: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
c490: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
c4a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c4b0: 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  T;.        nFrag
c4c0: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
c4d0: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
c4e0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
c4f0: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
c500: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
c510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c520: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
c530: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
c540: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c550: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
c560: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
c570: 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32  if( iStart==get2
c580: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c590: 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ]) ){.    /* The
c5a0: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
c5b0: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
c5c0: 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
c5d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
c5e0: 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
c5f0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
c600: 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
c610: 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
c620: 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
c630: 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
c640: 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31   if( iPtr!=hdr+1
c650: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c660: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c670: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c680: 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42  a[hdr+1], iFreeB
c690: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
c6a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
c6b0: 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iEnd);.  }else{.
c6c0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
c6d0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
c6e0: 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  into the freelis
c6f0: 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74  t */.    put2byt
c700: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69  e(&data[iPtr], i
c710: 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32  Start);.    put2
c720: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
c730: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
c740: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c750: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
c760: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c770: 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
c780: 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
c790: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c7a0: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
c7b0: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
c7c0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c7d0: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
c7e0: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
c7f0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
c800: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
c810: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
c820: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
c830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
c840: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
c850: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
c860: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
c870: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
c880: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
c890: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
c8a0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
c8b0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c8c0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
c8d0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
c8e0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
c8f0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
c900: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
c910: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
c920: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
c930: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
c940: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c950: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
c960: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
c970: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
c980: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
c990: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c9a0: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
c9b0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c9c0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
c9d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c9e0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
c9f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ca00: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ca10: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ca20: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
ca30: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
ca40: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
ca50: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
ca60: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
ca70: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
ca80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ca90: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
caa0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
cab0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
cac0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
cad0: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
cae0: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
caf0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
cb00: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
cb10: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
cb20: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cb30: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
cb40: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
cb50: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
cb60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
cb70: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
cb80: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
cb90: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
cba0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
cbb0: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
cbc0: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
cbd0: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
cbe0: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
cbf0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
cc00: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
cc10: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
cc20: 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  = pPage->leaf;. 
cc30: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
cc40: 6f 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65  oad = !pPage->le
cc50: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
cc60: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
cc70: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
cc80: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
cc90: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
cca0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
ccb0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
ccc0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
ccd0: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
cce0: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
ccf0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
cd00: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
cd10: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
cd20: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
cd30: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
cd40: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
cd50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cd60: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
cd70: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
cd80: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
cd90: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
cda0: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
cdb0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cdc0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
cdd0: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
cde0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
cdf0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
ce00: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
ce10: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
ce20: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
ce30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ce40: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
ce50: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
ce60: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
ce70: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
ce80: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ce90: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
cea0: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
ceb0: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
cec0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
ced0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
cee0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cef0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cf00: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
cf10: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
cf20: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
cf30: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
cf40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cf50: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cf60: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
cf70: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
cf80: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
cf90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
cfa0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
cfb0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
cfc0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
cfd0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
cfe0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
cff0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
d000: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
d010: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
d020: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
d030: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
d040: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
d050: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
d060: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
d070: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
d080: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
d090: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
d0a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d0b0: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
d0c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
d0d0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
d0e0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d0f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d100: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
d110: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d120: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d130: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d140: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d150: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
d160: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
d170: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d190: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
d1a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d1b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d1c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
d1d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
d1e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d1f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
d200: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
d210: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
d220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d230: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
d240: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
d250: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
d260: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
d270: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
d280: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
d290: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
d2a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
d2b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
d2c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
d2d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
d2e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
d2f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
d300: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
d310: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
d320: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
d330: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
d340: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
d350: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
d360: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
d370: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
d380: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
d390: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
d3a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
d3b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
d3c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
d3d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
d3e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
d3f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
d400: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
d410: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
d420: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
d430: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
d440: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
d450: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
d460: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
d470: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
d480: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
d490: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
d4a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
d4b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
d4c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d4d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
d4e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
d4f0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
d500: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
d510: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
d520: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
d530: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
d540: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
d550: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
d560: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
d570: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
d580: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
d590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
d5b0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
d5c0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
d5d0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
d5e0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
d5f0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
d600: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
d610: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
d620: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
d630: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
d640: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
d650: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
d660: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
d670: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
d680: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
d690: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
d6a0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
d6b0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
d6c0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
d6d0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
d6e0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d6f0: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
d700: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
d710: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
d720: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a  designates.    *
d730: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
d740: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d750: 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c  area. A zero val
d760: 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65  ue for this inte
d770: 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e  ger is.    ** in
d780: 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
d790: 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d  36. */.    top =
d7a0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
d7b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
d7c0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
d7d0: 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37  OF: R-37002-3277
d7e0: 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  4 The two-byte i
d7f0: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
d800: 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   3 gives the.   
d810: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65   ** number of ce
d820: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  lls on the page.
d830: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   */.    pPage->n
d840: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
d850: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
d860: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
d870: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
d880: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
d890: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
d8a0: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
d8b0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
d8c0: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
d8d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d8e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d8f0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
d900: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
d910: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
d920: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
d930: 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
d940: 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
d950: 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
d960: 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20  ich is only.    
d970: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
d980: 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
d990: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
d9a0: 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
d9b0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66  en the.    ** of
d9c0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
d9d0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
d9e0: 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
d9f0: 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
da00: 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
da10: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
da20: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
da30: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
da40: 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
da50: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
da60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
da70: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
da80: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
da90: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
daa0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
dab0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
dac0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
dad0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
dae0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
daf0: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
db00: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
db10: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
db20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
db30: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
db40: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
db50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
db60: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
db70: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
db80: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
db90: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
dba0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
dbb0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
dbc0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
dbd0: 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20  ze - 4;.    if( 
dbe0: 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
dbf0: 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
dc00: 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ck ){.      int 
dc10: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
dc20: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dc30: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dc40: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dc50: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dc60: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dc70: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dc80: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dc90: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dcb0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dcc0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dcd0: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dce0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dcf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd00: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dd10: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dd20: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
dd30: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dd40: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
dd50: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dd60: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dd70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dd80: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dd90: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
dda0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
ddb0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
ddc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ddd0: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
dde0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ddf0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
de10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
de20: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
de30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
de40: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
de50: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
de60: 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f  ;.    }  ..    /
de70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
de80: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
de90: 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  n the page.    *
dea0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
deb0: 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65  -23588-34450 The
dec0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ded0: 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69  r at offset 1 gi
dee0: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ves the.    ** s
def0: 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73  tart of the firs
df00: 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74  t freeblock on t
df10: 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a  he page, or is z
df20: 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
df30: 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62   no.    ** freeb
df40: 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63  locks. */.    pc
df50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
df60: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
df70: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
df80: 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e  7] + top;  /* In
df90: 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d  it nFree to non-
dfa0: 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73  freeblock free s
dfb0: 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c  pace */.    whil
dfc0: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
dfd0: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
dfe0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
dff0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
e000: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
e010: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e020: 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
e030: 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
e040: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
e050: 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
e060: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
e070: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
e080: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  l before the fir
e090: 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20  st freeblock..  
e0a0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e0b0: 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65   ** Or, the free
e0c0: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
e0d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
e0e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e0f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e100: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
e110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
e120: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
e130: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
e140: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
e150: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
e160: 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30       if( (next>0
e170: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
e180: 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  e+3) || pc+size>
e190: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e1a0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
e1b0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
e1c0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
e1d0: 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79   And the last by
e1e0: 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  te of.        **
e1f0: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
e200: 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20  must lie on the 
e210: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
e220: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e230: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e240: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e250: 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46        nFree = nF
e260: 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20  ree + size;.    
e270: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
e280: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
e290: 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
e2a0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
e2b0: 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
e2c0: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
e2d0: 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
e2e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
e2f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
e300: 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
e310: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
e320: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
e330: 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
e340: 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
e350: 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
e360: 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
e370: 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
e380: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
e390: 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
e3a0: 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
e3b0: 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
e3c0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
e3d0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
e3e0: 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
e3f0: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
e400: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
e410: 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
e420: 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
e430: 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
e440: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
e450: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e460: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
e470: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
e480: 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
e490: 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
e4a0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
e4b0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
e4c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e4d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
e4e0: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
e4f0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
e500: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
e510: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
e520: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
e530: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
e540: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
e550: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
e560: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e570: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e580: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
e590: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
e5a0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
e5b0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
e5c0: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
e5d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e5e0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
e5f0: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
e600: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
e610: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
e620: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
e630: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
e640: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
e650: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e660: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
e670: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
e680: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
e690: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
e6a0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
e6b0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
e6c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e6d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e6e0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
e6f0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
e700: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
e710: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
e720: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
e730: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
e740: 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
e750: 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
e760: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
e770: 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
e780: 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
e790: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
e7a0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
e7b0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
e7c0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
e7d0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
e7e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
e7f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
e800: 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
e810: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
e820: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
e830: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
e840: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
e850: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
e860: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
e870: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
e880: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
e890: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
e8a0: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
e8b0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
e8d0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
e8e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
e8f0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
e900: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
e910: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
e920: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
e930: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
e940: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
e950: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
e960: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
e970: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
e980: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
e990: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
e9a0: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
e9b0: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
e9c0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
e9d0: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
e9e0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
e9f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ea00: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
ea10: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
ea20: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
ea30: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
ea40: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
ea50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
ea60: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
ea70: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
ea80: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
ea90: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
eaa0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
eab0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
eac0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
ead0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
eae0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
eaf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
eb00: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
eb10: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
eb20: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
eb30: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
eb40: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
eb50: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
eb60: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
eb70: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
eb80: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
eb90: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
eba0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
ebb0: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
ebc0: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
ebd0: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
ebe0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
ebf0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
ec00: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
ec10: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
ec20: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
ec30: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
ec40: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
ec50: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
ec60: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
ec70: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
ec80: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
ec90: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
eca0: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
ecb0: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
ecc0: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
ecd0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
ece0: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
ecf0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
ed00: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
ed10: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
ed20: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
ed30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ed40: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
ed50: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ed60: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
ed70: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
ed80: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
ed90: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
eda0: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
edb0: 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
edc0: 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
edd0: 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
ede0: 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
edf0: 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
ee00: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
ee10: 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
ee20: 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
ee30: 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
ee40: 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
ee50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ee60: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ee70: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
ee80: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
ee90: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
eea0: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
eeb0: 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  DbPage, flags);.
eec0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
eed0: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
eee0: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
eef0: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
ef00: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
ef10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ef20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
ef30: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
ef40: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
ef50: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
ef60: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
ef70: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
ef80: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
ef90: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
efa0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
efb0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
efc0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
efd0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
efe0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
eff0: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
f000: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
f010: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
f020: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
f030: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f040: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
f050: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
f060: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
f070: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
f080: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
f090: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
f0a0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
f0b0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
f0c0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
f0d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f0f0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
f100: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
f110: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
f120: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
f130: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
f140: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
f150: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
f160: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
f170: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
f180: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
f190: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
f1a0: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
f1b0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
f1c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
f1d0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
f1e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
f1f0: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
f200: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
f210: 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
f220: 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
f230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
f240: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
f250: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
f260: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
f270: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a  tine is just a.*
f280: 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  * convenience wr
f290: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
f2a0: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62  arate calls to b
f2b0: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
f2c0: 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  d .** btreeInitP
f2d0: 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
f2e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
f2f0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
f300: 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
f310: 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  o is undefined. 
f320: 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
f330: 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
f340: 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
f350: 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
f360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f370: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
f380: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3a0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
f3b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
f3c0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f3e0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
f3f0: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
f400: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f420: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
f430: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
f440: 20 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20    int bReadonly 
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52    /* PAGER_GET_R
f470: 45 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a  EADONLY or 0 */.
f480: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
f490: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f4a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
f4b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
f4c0: 74 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41  t( bReadonly==PA
f4d0: 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
f4e0: 20 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30   || bReadonly==0
f4f0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
f500: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
f510: 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
f520: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f530: 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
f540: 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
f550: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
f560: 70 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79  pPage, bReadonly
f570: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
f580: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
f590: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
f5a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
f5b0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
f5c0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
f5d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f5e0: 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
f5f0: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
f600: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f610: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  }..  testcase( p
f620: 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
f630: 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
f640: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
f650: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
f660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
f670: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
f680: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
f690: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
f6a0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
f6b0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
f6c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f6d0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
f6e0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
f6f0: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
f700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f710: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
f720: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
f730: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f740: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
f750: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f760: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
f770: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
f780: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
f790: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
f7a0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
f7b0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
f7c0: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
f7d0: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
f7e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f7f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f800: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f810: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
f820: 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
f830: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
f840: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
f850: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
f860: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
f870: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
f880: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
f890: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
f8a0: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
f8b0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
f8c0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
f8d0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
f8e0: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
f8f0: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
f900: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f910: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
f920: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
f930: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
f940: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
f950: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
f960: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
f970: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
f980: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
f990: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
f9a0: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
f9b0: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
f9c0: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
f9d0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
f9e0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
f9f0: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
fa00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
fa10: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
fa20: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
fa30: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
fa40: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
fa50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fa60: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
fa70: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
fa80: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
fa90: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
faa0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
fab0: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
fac0: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
fad0: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
fae0: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
faf0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
fb00: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
fb10: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
fb20: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
fb30: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
fb40: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
fb50: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
fb60: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
fb70: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
fb80: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
fb90: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
fba0: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
fbb0: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
fbc0: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
fbd0: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
fbe0: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
fbf0: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
fc00: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
fc10: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
fc20: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
fc30: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
fc40: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
fc50: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
fc60: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
fc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
fc80: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
fc90: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
fca0: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
fcb0: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
fcc0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
fcd0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
fce0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
fcf0: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
fd00: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
fd10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
fd20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fd30: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
fd40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
fd50: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
fd60: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
fd70: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
fd80: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
fd90: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
fda0: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
fdb0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
fdc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
fdd0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
fde0: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
fdf0: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
fe00: 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
fe10: 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
fe20: 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
fe30: 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
fe40: 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
fe50: 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
fe60: 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
fe70: 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
fe80: 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
fe90: 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
fea0: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
feb0: 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
fec0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
fed0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
fee0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
fef0: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
ff00: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
ff10: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
ff20: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
ff30: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
ff40: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
ff50: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
ff60: 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
ff70: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
ff80: 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
ff90: 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
ffa0: 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
ffb0: 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
ffc0: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
ffd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
ffe0: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
fff0: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
10000 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
10010 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
10020 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
10030 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
10040 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
10050 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
10060 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
10070 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
10080 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
10090 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
100a0 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
100b0 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
100c0 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
100d0 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
100e0 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
100f0 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
10100 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10110 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
10120 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
10130 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
10140 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
10150 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10160 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
10170 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
10180 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
10190 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
101a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
101b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
101c0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
101d0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
101e0 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
101f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
10200 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
10210 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
10220 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
10230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10240 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
10250 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
10260 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
10270 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
10280 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
10290 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
102a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102c0 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
102d0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
102e0 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
10310 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
10320 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
10330 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
10340 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
10350 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
10360 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
10370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
10390 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
103a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
103b0 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
103e0 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
103f0 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
10400 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
10410 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
10420 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
10430 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
10440 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
10450 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
10460 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
10470 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
10480 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
10490 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
104a0 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
104b0 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
104c0 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
104d0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
104e0 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
104f0 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
10500 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
10510 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
10520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
10530 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
10540 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
10550 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
10560 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
10570 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
10580 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
10590 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
105c0 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
105d0 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
10600 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
10610 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
10620 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
10630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
10640 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
10650 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10660 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
10670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
10680 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
10690 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
106a0 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
106b0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
106c0 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
106d0 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
106e0 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
106f0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
10700 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
10710 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
10720 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
10730 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
10740 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
10750 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
10760 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
10770 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
10780 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
10790 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
107a0 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
107b0 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
107c0 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
107d0 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
107e0 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
107f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
10800 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
10810 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
10820 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
10830 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
10840 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
10850 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
10860 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
10870 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
10880 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
10890 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
108a0 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
108b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
108c0 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
108d0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
108e0 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
108f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10900 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
10910 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
10920 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
10930 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
10940 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10950 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10960 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10970 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10980 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
10990 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
109a0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
109b0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
109c0 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
109d0 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
109e0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
109f0 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
10a00 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
10a10 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
10a20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
10a30 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
10a40 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
10a50 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
10a60 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
10a70 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
10a80 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
10a90 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
10aa0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
10ab0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
10ac0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
10ad0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
10ae0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
10af0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
10b00 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
10b10 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
10b20 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
10b30 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
10b40 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
10b50 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
10b60 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
10b70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
10b80 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
10b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
10ba0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
10bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10bc0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
10bd0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
10be0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
10bf0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
10c00 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
10c10 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
10c20 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
10c30 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
10c40 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
10c50 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
10c80 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
10c90 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
10ca0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10cc0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
10cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
10ce0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
10cf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10d00 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
10d10 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
10d20 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
10d30 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
10d40 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
10d50 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
10d60 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
10d70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10d80 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
10d90 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
10da0 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
10db0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10dc0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
10dd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10de0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
10df0 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
10e00 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
10e10 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10e20 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10e30 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
10e40 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
10e50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10e60 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
10e70 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
10e80 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
10e90 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
10ea0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
10eb0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
10ec0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
10ed0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
10ee0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
10ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
10f00 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
10f10 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
10f20 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
10f30 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
10f40 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
10f50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
10f60 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
10f70 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
10f80 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
10f90 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
10fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
10fb0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
10fc0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
10fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
10fe0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
10ff0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
11000 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11010 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
11020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11030 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
11040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
11050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
11060 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
11070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11080 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
11090 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
110a0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
110b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
110c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
110d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
110e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
110f0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
11100 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11110 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
11120 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
11130 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
11140 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
11150 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
11160 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
11170 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
11180 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
11190 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
111a0 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
111b0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
111c0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
111d0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
111e0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
111f0 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
11200 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
11210 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
11220 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
11230 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
11240 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
11250 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
11260 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
11270 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
11280 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
11290 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
112a0 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
112b0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
112c0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
112d0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
112e0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
112f0 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
11300 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
11310 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
11320 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
11330 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
11340 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
11350 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
11360 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
11370 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
11380 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11390 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
113a0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
113b0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
113c0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
113d0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
113e0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
113f0 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
11400 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
11410 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
11420 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
11430 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
11440 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11450 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
11460 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
11470 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
11480 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
11490 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
114a0 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
114d0 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
114e0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
114f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11510 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
11520 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
11530 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
11540 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11550 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
11560 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
11570 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
11580 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
11590 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
115a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
115b0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
115c0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
115d0 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
115e0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
115f0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
11600 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
11610 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
11620 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
11630 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
11640 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
11650 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
11660 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
11670 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
11680 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
11690 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
116a0 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
116b0 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
116c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
116d0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
116e0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
116f0 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
11700 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
11710 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
11720 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
11730 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
11740 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
11750 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
11760 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
11770 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
11780 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
11790 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
117a0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
117b0 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
117c0 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
117d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
117e0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
117f0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
11800 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
11810 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
11820 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
11830 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
11840 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
11850 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
11860 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
11870 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
11880 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
11890 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
118a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
118b0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
118c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
118d0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
118e0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
118f0 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
11900 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
11910 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
11920 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
11930 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
11940 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
11950 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
11960 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
11970 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
11980 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
11990 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
119a0 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
119b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
119c0 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
119d0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
119e0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
119f0 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
11a00 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
11a10 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
11a20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
11a30 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
11a40 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
11a50 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
11a60 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
11a70 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
11a80 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
11a90 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
11aa0 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
11ab0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
11ac0 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
11ad0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
11ae0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
11af0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
11b00 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
11b10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
11b20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
11b30 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
11b40 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
11b50 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
11b60 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
11b70 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
11b80 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
11b90 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
11ba0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
11bb0 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
11bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11bd0 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
11be0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
11bf0 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
11c00 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
11c10 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
11c20 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
11c30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11c40 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
11c50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11c60 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
11c70 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
11c80 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
11c90 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
11ca0 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
11cb0 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
11cc0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
11cd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11ce0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
11cf0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
11d00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
11d10 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
11d20 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
11d30 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
11d40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11d50 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11d60 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
11d70 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
11d80 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
11d90 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
11da0 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
11db0 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
11dc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11dd0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
11de0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
11df0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
11e00 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
11e10 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
11e20 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
11e30 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
11e40 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
11e50 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
11e60 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
11e70 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
11e80 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
11e90 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
11ea0 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
11eb0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
11ec0 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
11ed0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
11ee0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
11ef0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
11f00 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
11f10 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
11f20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
11f30 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
11f40 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
11f50 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
11f60 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
11f70 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
11f80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
11f90 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
11fa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11fb0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
11fc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11fe0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
11ff0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
12000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12010 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12020 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
12030 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
12040 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
12050 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12060 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
12070 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
12080 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12090 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
120a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
120b0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
120c0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
120d0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
120e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
120f0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
12100 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
12110 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
12120 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
12130 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
12140 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
12150 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
12160 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
12170 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
12180 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
12190 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
121a0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
121b0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
121c0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
121d0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
121e0 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
121f0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
12200 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12210 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
12220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
12230 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
12240 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
12250 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
12260 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
12270 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
12280 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
12290 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
122a0 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
122b0 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
122c0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
122d0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
122e0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
122f0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
12300 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
12310 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
12320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12330 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
12340 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
12350 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
12360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
12370 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
12380 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12390 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
123a0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
123b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
123c0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
123d0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
123e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
123f0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
12400 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
12410 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
12420 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
12430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
12440 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12450 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
12460 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
12470 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
12480 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12490 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
124a0 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
124b0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
124c0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
124d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
124e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
124f0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
12500 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
12510 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
12520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
12530 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
12540 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
12550 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
12560 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
12570 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
12580 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
12590 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
125a0 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
125b0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
125c0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
125d0 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
125e0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
125f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
12600 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
12610 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
12620 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
12630 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
12640 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
12650 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
12660 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
12670 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
12680 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
12690 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
126a0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
126b0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
126c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
126d0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
126e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
126f0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
12700 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
12710 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
12720 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
12730 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
12740 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
12750 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
12760 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
12770 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
12780 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
12790 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
127a0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
127b0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
127c0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
127d0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
127e0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
127f0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
12800 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
12810 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12820 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
12830 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
12840 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
12850 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
12860 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
12870 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
12880 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
12890 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
128a0 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
128b0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
128c0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
128d0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
128e0 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
128f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12900 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
12910 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
12920 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
12930 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
12940 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
12950 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
12960 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
12970 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
12980 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
12990 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
129a0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
129b0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
129c0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
129d0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
129e0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
129f0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
12a00 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
12a10 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
12a20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
12a30 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
12a40 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
12a50 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
12a60 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
12a70 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
12a80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12a90 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
12aa0 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
12ab0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
12ac0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
12ad0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
12ae0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
12af0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12b00 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
12b10 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
12b20 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
12b30 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
12b40 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
12b50 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
12b60 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
12b70 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
12b80 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
12b90 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
12ba0 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
12bb0 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
12bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12bd0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
12be0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
12bf0 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
12c00 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
12c10 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
12c20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
12c30 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
12c40 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
12c50 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
12c60 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
12c70 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
12c80 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
12c90 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
12ca0 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
12cb0 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
12cc0 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
12cd0 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
12ce0 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
12cf0 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
12d00 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
12d10 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
12d20 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
12d30 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
12d40 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
12d50 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
12d60 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
12d70 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
12d80 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
12d90 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
12da0 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
12db0 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
12dc0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
12dd0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
12de0 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
12df0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
12e00 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
12e10 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
12e20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
12e30 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
12e40 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
12e50 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
12e60 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
12e70 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
12e80 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
12e90 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
12ea0 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
12eb0 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
12ec0 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
12ed0 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
12ee0 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
12ef0 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
12f00 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
12f10 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
12f20 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
12f30 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
12f40 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
12f50 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
12f60 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
12f70 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
12f80 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
12f90 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
12fa0 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
12fb0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
12fc0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
12fd0 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
12fe0 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
12ff0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
13000 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
13010 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
13020 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
13030 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
13040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
13050 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
13060 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
13070 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
13080 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
13090 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
130a0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
130b0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
130c0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
130d0 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
130e0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
130f0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
13100 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
13110 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
13120 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
13130 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
13140 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13150 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
13160 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
13170 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
13180 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
13190 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
131a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
131b0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
131c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
131d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
131e0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
131f0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
13200 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
13210 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
13220 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
13230 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
13240 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
13250 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
13260 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
13270 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
13280 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
13290 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
132a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
132b0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
132c0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
132d0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
132e0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
132f0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
13300 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
13310 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
13320 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
13330 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
13340 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
13350 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13360 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
13370 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
13380 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
13390 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
133a0 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
133b0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
133c0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
133d0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
133e0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
133f0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
13400 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
13410 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
13420 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
13430 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
13440 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
13450 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
13460 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
13470 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
13480 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
13490 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
134a0 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
134b0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
134c0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
134d0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
134e0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
134f0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
13500 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
13510 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
13520 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
13530 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
13540 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
13550 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
13560 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
13570 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
13580 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
13590 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
135a0 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
135b0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
135c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
135d0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
135e0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
135f0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
13600 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
13610 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
13620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13630 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
13640 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
13650 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
13660 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
13670 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
13680 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
13690 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
136a0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
136b0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
136c0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
136d0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
136e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
136f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13700 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
13710 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
13720 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
13730 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
13740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
13750 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
13760 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
13770 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
13780 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
13790 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
137a0 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
137b0 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
137c0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
137d0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
137e0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
137f0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
13800 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
13810 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
13820 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
13830 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
13840 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
13850 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
13860 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
13870 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
13880 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
13890 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
138a0 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
138b0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
138c0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
138d0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
138e0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
138f0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
13900 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
13910 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
13920 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
13930 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
13940 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
13950 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
13960 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
13970 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
13980 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
13990 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
139a0 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
139b0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
139c0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
139d0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
139e0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
139f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
13a00 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
13a10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13a20 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
13a30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13a40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
13a50 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
13a60 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
13a70 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
13a80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13a90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
13aa0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if 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 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
13ad0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
13ae0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
13af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13b00 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
13b10 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
13b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13b30 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
13b40 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
13b50 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
13b60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13b70 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
13b80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13b90 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
13ba0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
13bb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13bc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13bd0 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
13be0 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
13bf0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13c00 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
13c20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
13c30 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
13c40 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
13c50 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
13c60 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
13c70 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
13c80 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
13c90 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
13ca0 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
13cb0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
13cc0 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
13cd0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
13ce0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
13cf0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
13d00 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
13d10 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
13d20 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
13d30 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
13d40 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
13d50 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
13d60 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
13d70 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
13d80 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
13d90 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
13da0 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
13db0 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
13dc0 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
13dd0 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
13de0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
13df0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
13e00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13e10 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
13e20 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
13e30 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
13e40 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
13e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13e60 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
13e70 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
13e80 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
13e90 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
13ea0 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
13eb0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
13ec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13ed0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
13ee0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13ef0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
13f00 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
13f10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13f20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
13f30 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
13f40 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
13f50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13f60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
13f70 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
13f80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
13f90 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
13fa0 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
13fb0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
13fc0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
13fd0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
13fe0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
13ff0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
14000 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
14010 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
14020 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
14030 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
14040 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
14050 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
14060 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14070 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
14080 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
14090 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
140a0 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
140b0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
140c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
140d0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
140e0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
140f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14100 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14110 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
14120 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
14130 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
14140 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
14150 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
14160 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
14170 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
14180 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
14190 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
141a0 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
141b0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
141c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
141d0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
141e0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
141f0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
14200 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
14210 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
14220 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
14230 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
14240 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
14250 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
14260 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
14270 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
14280 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
14290 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
142a0 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
142b0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
142c0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
142d0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
142e0 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
142f0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
14300 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
14310 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
14320 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
14330 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
14340 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
14350 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
14360 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
14370 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
14380 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
14390 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
143a0 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
143b0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
143c0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
143d0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
143e0 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
143f0 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
14400 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
14410 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
14420 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
14430 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
14440 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
14450 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
14460 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
14470 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
14480 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
14490 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
144a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
144b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
144c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
144d0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
144e0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
144f0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
14500 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
14510 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
14520 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
14530 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
14540 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
14550 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
14560 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
14570 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
14580 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
14590 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
145a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
145b0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
145c0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
145d0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
145e0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
145f0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
14600 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
14610 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
14620 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
14630 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
14640 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
14650 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
14660 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
14670 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14680 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
14690 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
146a0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
146b0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
146c0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
146d0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
146e0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
146f0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
14700 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
14710 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
14720 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
14730 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
14740 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
14750 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
14760 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
14770 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
14780 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
14790 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
147a0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
147b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
147c0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
147d0 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
147e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
147f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14800 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
14810 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
14820 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
14830 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
14840 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
14850 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
14860 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
14870 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
14880 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
14890 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
148a0 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
148b0 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
148c0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
148d0 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
148e0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
148f0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
14900 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
14910 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
14920 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
14930 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
14940 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
14950 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
14960 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
14970 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
14980 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
14990 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
149a0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
149b0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
149c0 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
149d0 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
149e0 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
149f0 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
14a00 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
14a10 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
14a20 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
14a30 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
14a40 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
14a50 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
14a60 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
14a70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14a80 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
14a90 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
14aa0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
14ab0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14ac0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
14ad0 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
14ae0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
14af0 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
14b00 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
14b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14b20 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14b30 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
14b40 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
14b50 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
14b60 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
14b70 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
14b80 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
14b90 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
14ba0 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
14bb0 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
14bc0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
14bd0 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
14be0 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
14bf0 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
14c00 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
14c10 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
14c20 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
14c30 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
14c40 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
14c50 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
14c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14c70 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
14c80 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
14c90 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
14ca0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14cb0 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
14cc0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
14cd0 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
14ce0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
14cf0 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
14d00 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
14d10 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
14d20 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
14d30 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
14d40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14d50 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
14d60 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
14d70 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
14d80 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
14d90 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
14da0 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
14db0 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
14dc0 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
14dd0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
14de0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
14df0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
14e00 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
14e10 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
14e20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
14e30 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
14e40 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
14e50 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
14e60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14e70 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
14e80 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
14e90 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
14ea0 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
14eb0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14ec0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
14ed0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42  ./*.** Set the B
14ee0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
14ef0 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
14f00 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
14f10 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
14f20 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
14f30 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
14f40 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
14f50 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55   of the BTS_SECU
14f60 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74  RE_DELETE.** set
14f70 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
14f80 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
14f90 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
14fa0 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
14fb0 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
14fc0 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
14fd0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14ff0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
15000 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
15010 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
15020 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44  &= ~BTS_SECURE_D
15030 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e  ELETE;.    if( n
15040 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d  ewFlag ) p->pBt-
15050 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
15060 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
15070 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70    } .  b = (p->p
15080 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
15090 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
150a0 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  )!=0;.  sqlite3B
150b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
150c0 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a  return b;.}../*.
150d0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
150e0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
150f0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
15100 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
15110 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
15120 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
15130 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
15140 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
15150 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
15160 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
15170 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
15180 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
15190 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
151a0 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
151b0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
151c0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
151d0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
151e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
151f0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
15200 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
15210 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
15220 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15230 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
15240 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
15250 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
15260 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15270 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15280 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
15290 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
152a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
152b0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
152c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
152d0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
152e0 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
152f0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
15300 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
15310 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
15330 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
15340 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
15350 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
15360 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
15370 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15380 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15390 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
153a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
153b0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
153c0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
153d0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
153e0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
153f0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
15400 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
15410 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15420 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
15430 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
15440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15450 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
15460 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
15470 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
15480 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
15490 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
154a0 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
154b0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
154c0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
154d0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
154e0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
154f0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
15500 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
15510 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
15520 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
15530 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15540 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
15550 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
15560 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
15570 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
15580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15590 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
155a0 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
155b0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
155c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
155d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
155e0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
155f0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
15600 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
15610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15620 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
15630 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
15640 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
15650 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
15660 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
15670 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
15680 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
15690 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
156a0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
156b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
156c0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
156d0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156f0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
15700 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
15710 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
15720 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
15730 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
15740 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
15750 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
15760 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
15770 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
15780 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
15790 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
157a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
157b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
157c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
157d0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
157e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
157f0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
15800 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
15810 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
15820 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15830 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
15850 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
15860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15870 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
15880 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
15890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
158a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
158b0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
158c0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
158d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
158e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
158f0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
15900 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
15910 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
15920 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
15930 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
15940 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
15950 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
15960 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
15970 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
15980 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
15990 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
159a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
159b0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
159c0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
159d0 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
159e0 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
159f0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
15a00 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
15a10 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
15a20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
15a30 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
15a40 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
15a50 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
15a60 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
15a70 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
15a80 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
15a90 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
15aa0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
15ab0 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39  F: R-43737-39999
15ac0 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c   Every valid SQL
15ad0 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
15ae0 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20  e begins.    ** 
15af0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
15b00 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20  ng 16 bytes (in 
15b10 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36  hex): 53 51 4c 6
15b20 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66  9 74 65 20 66 6f
15b30 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31   72 6d.    ** 61
15b40 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f   74 20 33 00. */
15b50 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
15b60 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
15b70 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
15b80 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
15b90 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
15ba0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15bb0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
15bc0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
15bd0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
15be0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
15bf0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
15c00 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
15c10 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
15c20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15c30 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
15c40 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
15c50 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
15c60 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
15c70 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
15c80 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
15c90 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
15ca0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
15cb0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
15cc0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
15cd0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
15ce0 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
15cf0 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
15d00 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
15d10 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
15d20 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
15d30 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
15d40 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
15d50 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
15d60 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
15d70 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
15d80 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
15d90 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
15da0 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
15db0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
15dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
15dd0 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
15de0 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
15df0 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
15e00 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
15e10 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
15e20 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
15e30 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
15e40 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
15e50 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
15e60 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
15e70 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
15e80 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
15e90 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
15ea0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
15eb0 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
15ec0 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
15ed0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
15ee0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
15ef0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
15f00 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
15f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15f20 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15f30 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
15f40 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
15f50 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
15f60 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
15f70 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
15f80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15f90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
15fa0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15fb0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
15fc0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
15fd0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
15fe0 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
15ff0 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
16000 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
16010 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
16020 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
16030 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
16040 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
16050 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
16060 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16070 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
16080 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
16090 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
160a0 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
160b0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
160c0 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
160d0 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
160e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
160f0 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
16100 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
16110 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
16120 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
16130 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
16140 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
16150 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
16160 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
16170 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
16180 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
16190 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
161a0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
161b0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
161c0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
161d0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
161e0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
161f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
16200 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
16210 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
16220 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
16230 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
16240 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
16250 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
16260 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
16270 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
16280 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
16290 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
162a0 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
162b0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
162c0 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
162d0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
162e0 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
162f0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
16300 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
16310 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
16320 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
16330 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
16340 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
16350 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
16360 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
16370 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
16380 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
16390 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
163a0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
163b0 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
163c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
163d0 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
163e0 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
163f0 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
16400 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
16410 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
16420 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
16430 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
16440 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
16450 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
16460 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
16470 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
16480 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
16490 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
164a0 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
164b0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
164c0 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
164d0 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
164e0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
164f0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
16500 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
16510 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
16520 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
16530 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
16540 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
16550 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
16560 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
16570 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
16580 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
16590 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
165a0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
165b0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
165c0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
165d0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
165e0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
165f0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
16600 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
16610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
16620 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
16630 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
16640 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
16650 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
16660 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
16670 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
16680 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
16690 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
166a0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
166b0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
166c0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
166d0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
166e0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
166f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16700 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
16710 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
16720 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
16760 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
16770 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16780 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
16790 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
167a0 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
167b0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
167c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
167d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
167e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
167f0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
16800 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
16810 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16820 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
16830 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
16840 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
16850 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
16860 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
16870 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
16880 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
16890 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
168a0 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
168b0 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
168c0 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
168d0 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
168e0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
168f0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
16900 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
16910 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
16920 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
16930 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
16940 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
16950 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16960 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
16970 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
16980 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
16990 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
169a0 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
169b0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
169c0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
169d0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
169e0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
169f0 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
16a00 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
16a10 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
16a20 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
16a30 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
16a40 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
16a50 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
16a60 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
16a70 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
16a80 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
16a90 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
16aa0 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
16ab0 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
16ac0 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
16ad0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
16ae0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
16af0 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
16b00 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
16b10 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
16b20 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
16b30 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
16b40 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
16b50 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
16b60 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
16b70 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
16b80 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
16b90 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
16ba0 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
16bb0 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
16bc0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
16bd0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
16be0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
16bf0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
16c00 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
16c10 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
16c20 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
16c30 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
16c40 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
16c50 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
16c60 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
16c70 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
16c80 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
16c90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
16ca0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
16cb0 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
16cc0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
16cd0 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
16ce0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
16cf0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
16d00 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
16d10 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
16d20 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
16d30 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
16d40 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
16d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16d60 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
16d70 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
16d80 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
16d90 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
16da0 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
16db0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
16dc0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
16dd0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
16de0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
16df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16e00 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
16e10 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
16e20 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
16e30 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
16e40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16e50 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
16e60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16e70 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
16e80 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
16e90 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
16ea0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
16eb0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
16ec0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
16ed0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
16ee0 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
16ef0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
16f00 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
16f10 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
16f20 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
16f30 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
16f40 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
16f50 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
16f60 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
16f70 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
16f80 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
16f90 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
16fa0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
16fb0 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
16fc0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
16fd0 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
16fe0 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
16ff0 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
17000 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
17010 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
17020 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
17030 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
17040 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
17050 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
17060 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
17070 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
17080 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
17090 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
170a0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
170b0 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
170c0 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
170d0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
170e0 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
170f0 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
17100 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
17110 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
17120 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
17130 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
17140 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
17150 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
17160 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
17170 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
17180 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
17190 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
171a0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
171b0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
171c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
171d0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
171e0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
171f0 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
17200 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
17210 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
17220 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
17230 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
17240 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
17250 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
17260 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
17270 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
17280 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
17290 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
172a0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
172b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
172c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
172d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
172e0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
172f0 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
17300 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
17310 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
17320 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
17330 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
17340 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
17350 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
17360 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
17370 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
17380 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
17390 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
173a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
173b0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
173c0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
173d0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
173e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
173f0 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
17400 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
17410 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
17420 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
17430 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
17440 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
17450 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
17460 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
17470 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
17480 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
174a0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
174b0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
174c0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
174d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
174e0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
174f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17500 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
17510 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
17520 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
17530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17540 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
17550 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
17560 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
17570 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
17580 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
17590 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
175a0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
175b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
175c0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
175d0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
175e0 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
175f0 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
17600 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
17610 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
17620 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
17630 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
17640 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
17650 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
17660 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
17670 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
17680 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
17690 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
176a0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
176b0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
176c0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
176d0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
176e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
176f0 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
17700 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
17710 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
17720 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
17730 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
17740 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
17750 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
17760 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
17770 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
17780 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
17790 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
177a0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
177b0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
177c0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
177d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
177e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
177f0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
17800 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
17810 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
17820 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
17830 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
17840 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
17850 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
17860 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
17870 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
17880 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
17890 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
178a0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
178b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
178c0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
178d0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
178e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
178f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
17900 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
17910 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
17920 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
17930 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
17940 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
17950 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
17960 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
17970 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
17980 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
17990 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
179a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
179b0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
179c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
179d0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
179e0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
179f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17a00 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
17a10 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
17a20 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
17a30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17a40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17a50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
17a60 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
17a70 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
17a80 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
17a90 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
17aa0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
17ab0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
17ac0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
17ad0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
17ae0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
17af0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17b00 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
17b10 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
17b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
17b30 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
17b40 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
17b50 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
17b60 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
17b70 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
17b80 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
17b90 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
17ba0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
17bb0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
17bc0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
17bd0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
17be0 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
17bf0 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
17c00 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
17c10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
17c20 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
17c30 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
17c40 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
17c50 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
17c60 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
17c70 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
17c80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
17c90 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
17ca0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
17cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17cc0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
17cd0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
17ce0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
17cf0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
17d00 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
17d10 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
17d20 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
17d30 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
17d40 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
17d50 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
17d60 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
17d70 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
17d80 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
17d90 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
17da0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
17db0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
17dc0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
17dd0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
17de0 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
17df0 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
17e00 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
17e10 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
17e20 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
17e30 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
17e40 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
17e50 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
17e60 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
17e70 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
17e80 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
17e90 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
17ea0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
17eb0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
17ec0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
17ed0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
17ee0 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
17ef0 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
17f00 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
17f10 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
17f20 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
17f30 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
17f40 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
17f50 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
17f60 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
17f70 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
17f80 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
17f90 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
17fa0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
17fb0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
17fc0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
17fd0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
17fe0 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
17ff0 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
18000 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
18010 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
18020 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
18030 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
18040 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
18050 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
18060 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
18070 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
18080 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
18090 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
180a0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
180b0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
180c0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
180d0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
180e0 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
180f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18100 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
18110 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
18120 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
18130 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
18140 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18150 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
18160 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
18170 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18180 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
18190 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
181a0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
181b0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
181c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
181d0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
181e0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
181f0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
18200 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
18210 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
18220 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
18230 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
18240 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
18250 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
18260 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
18270 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
18280 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
18290 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
182a0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
182b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
182c0 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
182d0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
182e0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
182f0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
18300 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
18310 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
18320 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
18330 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
18340 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
18350 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
18360 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
18370 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18380 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
18390 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
183a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
183b0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
183c0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
183d0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
183e0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
183f0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
18400 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
18410 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
18420 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
18430 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
18440 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
18450 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
18460 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
18470 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
18480 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
18490 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
184a0 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
184b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
184c0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
184d0 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
184e0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
184f0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
18500 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
18510 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
18520 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
18530 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
18540 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
18550 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
18560 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
18570 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
18580 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
18590 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
185a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
185b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
185c0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
185d0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
185e0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
185f0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
18600 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
18610 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
18620 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
18630 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18640 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
18650 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
18660 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
18670 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
18680 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
18690 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
186a0 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
186b0 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
186c0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
186d0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
186e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
186f0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
18700 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
18710 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
18720 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
18730 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
18740 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
18750 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
18760 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
18770 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
18780 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
18790 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
187a0 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
187b0 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
187c0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
187d0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
187e0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
187f0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
18800 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
18810 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
18820 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
18830 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
18840 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
18850 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
18860 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
18870 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
18880 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
18890 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
188a0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
188b0 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
188c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
188d0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
188e0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
188f0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
18900 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
18910 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
18920 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
18930 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
18940 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
18950 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
18960 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
18970 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
18980 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
18990 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
189a0 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
189b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
189c0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
189d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
189e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
189f0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
18a00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18a10 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18a30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18a40 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
18a50 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
18a60 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
18a70 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
18a80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
18a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18aa0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
18ab0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
18ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18ad0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
18ae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18af0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
18b00 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
18b10 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
18b20 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
18b30 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
18b40 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
18b50 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
18b60 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
18b70 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
18b80 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
18b90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18ba0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
18bb0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
18bc0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
18bd0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
18be0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18bf0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
18c00 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
18c10 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
18c20 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
18c30 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
18c40 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
18c50 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
18c60 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
18c70 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
18c80 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
18c90 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
18ca0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
18cb0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
18cc0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
18cd0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
18ce0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
18cf0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
18d00 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
18d10 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18d20 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
18d30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
18d40 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
18d50 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
18d60 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
18d70 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
18d80 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
18d90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
18da0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
18db0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
18dc0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
18dd0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
18de0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
18df0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
18e00 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
18e10 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
18e20 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
18e30 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
18e40 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
18e50 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
18e60 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
18e70 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
18e80 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
18e90 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
18ea0 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
18eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18ec0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
18ed0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
18ee0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
18ef0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
18f00 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
18f10 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
18f20 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
18f30 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
18f40 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
18f50 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
18f60 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
18f70 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
18f80 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
18f90 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
18fa0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
18fb0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
18fc0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
18fd0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
18fe0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
18ff0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
19000 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
19010 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
19020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19030 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
19040 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
19050 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
19060 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
19070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19080 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
19090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
190a0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
190b0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
190c0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
190d0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
190e0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
190f0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
19100 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
19110 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
19120 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
19130 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
19140 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
19150 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
19160 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
19170 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
19180 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
19190 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
191a0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
191b0 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
191c0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
191d0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
191e0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
191f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19200 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19210 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19220 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19230 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
19240 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
19250 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
19260 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
19270 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
19280 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
19290 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
192a0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
192b0 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
192c0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
192d0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
192e0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
192f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19300 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
19310 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
19320 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
19350 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
19360 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
19390 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
193a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
193d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
193e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
193f0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
19400 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
19410 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
19420 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
19430 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
19440 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19450 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
19460 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
19470 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
19480 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
19490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
194a0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
194b0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
194c0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
194d0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
194e0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
194f0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
19500 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
19510 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
19520 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
19530 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
19540 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
19550 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
19560 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
19570 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
19580 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
19590 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
195a0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
195b0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
195c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
195d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
195e0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
195f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
19600 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
19610 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
19620 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
19630 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
19640 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
19650 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
19660 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
19670 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
19680 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
19690 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
196a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
196b0 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
196c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
196d0 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
196e0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
196f0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
19700 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
19710 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
19720 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
19730 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
19740 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
19750 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
19760 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
19770 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
19780 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
19790 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
197a0 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
197b0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
197c0 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
197d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
197e0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
197f0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
19800 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
19810 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
19840 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
19850 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
19860 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
19870 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
19880 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
19890 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
198a0 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
198b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
198c0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
198d0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
198e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
198f0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
19900 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
19910 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
19920 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
19930 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19940 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
19950 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
19960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
19970 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
19980 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
19990 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
199a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
199b0 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
199c0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
199d0 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
199e0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
199f0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
19a00 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
19a10 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
19a20 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
19a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
19a60 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
19a70 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
19a80 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
19a90 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
19aa0 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
19ab0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
19ac0 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
19ad0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
19ae0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
19af0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19b00 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  c;.    nCell = p
19b10 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
19b20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
19b30 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
19b40 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
19b50 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
19b60 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
19b70 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
19b80 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
19b90 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
19ba0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
19bb0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
19bc0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
19bd0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
19be0 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20  erflow.         
19bf0 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  && pCell+info.iO
19c00 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65  verflow+3<=pPage
19c10 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
19c20 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20  askPage.        
19c30 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62   && iFrom==get4b
19c40 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
19c50 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20  iOverflow]).    
19c60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
19c70 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
19c80 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
19c90 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
19ca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19cb0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
19cc0 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
19cd0 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
19ce0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
19cf0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
19d00 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
19d10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
19d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19d30 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
19d40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
19d50 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
19d60 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
19d70 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
19d80 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
19d90 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
19da0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
19db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19dc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19dd0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
19de0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
19df0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
19e00 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
19e10 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
19e20 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
19e30 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
19e40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
19e50 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
19e60 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
19e70 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
19e80 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
19e90 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
19ea0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
19eb0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
19ec0 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
19ed0 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
19ee0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
19ef0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
19f00 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
19f10 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
19f20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
19f30 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
19f40 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
19f50 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
19f60 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
19f70 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
19f80 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
19f90 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
19fa0 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
19fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
19fc0 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
19fd0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
19fe0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
19ff0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
1a000 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
1a010 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
1a020 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a040 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
1a050 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
1a060 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1a070 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
1a080 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1a090 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
1a0a0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1a0b0 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
1a0c0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
1a0d0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
1a0e0 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
1a0f0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1a100 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
1a110 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
1a120 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1a130 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
1a140 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
1a150 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
1a160 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
1a170 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1a180 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
1a190 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
1a1a0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
1a1b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a1c0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
1a1d0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1a1e0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1a1f0 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
1a200 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1a210 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
1a220 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1a230 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1a240 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
1a250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a260 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1a270 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1a280 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
1a290 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
1a2a0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
1a2b0 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
1a2c0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
1a2d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
1a2e0 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
1a2f0 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
1a300 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
1a310 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
1a320 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
1a330 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
1a340 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
1a350 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
1a360 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1a370 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
1a380 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
1a390 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1a3a0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
1a3b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a3c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1a3d0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
1a3e0 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
1a3f0 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
1a400 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
1a410 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
1a420 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
1a430 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
1a440 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
1a450 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1a460 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
1a470 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1a480 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
1a490 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
1a4a0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
1a4b0 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
1a4c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1a4d0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
1a4e0 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
1a4f0 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
1a500 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
1a510 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1a520 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1a530 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
1a540 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1a550 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1a560 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
1a570 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1a580 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1a590 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1a5a0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1a5b0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1a5c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
1a5d0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
1a5e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1a5f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a600 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a610 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1a620 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
1a630 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
1a640 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1a650 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
1a660 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1a670 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
1a680 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1a690 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
1a6a0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
1a6b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a6c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a6d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1a6e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
1a6f0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
1a700 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
1a710 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
1a720 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
1a730 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
1a740 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
1a750 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
1a760 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1a770 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
1a780 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1a790 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
1a7a0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1a7b0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1a7c0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
1a7d0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
1a7e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a7f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1a800 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1a810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a820 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
1a830 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1a840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1a860 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1a870 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a880 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1a890 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
1a8a0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
1a8b0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1a8c0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
1a8d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1a8e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1a8f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a900 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1a910 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
1a920 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1a930 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1a940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a950 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1a960 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
1a970 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
1a980 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
1a990 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1a9a0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
1a9b0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
1a9c0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
1a9d0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
1a9e0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
1a9f0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
1aa00 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
1aa10 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
1aa20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1aa30 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
1aa40 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
1aa50 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
1aa60 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
1aa70 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
1aa80 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1aa90 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
1aaa0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1aab0 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
1aac0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
1aad0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
1aae0 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
1aaf0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1ab00 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
1ab10 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
1ab20 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
1ab30 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1ab40 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
1ab50 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
1ab60 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
1ab70 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
1ab80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1ab90 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
1aba0 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
1abb0 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
1abc0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
1abd0 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
1abe0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
1abf0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
1ac00 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
1ac10 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
1ac20 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1ac30 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
1ac40 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
1ac50 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
1ac60 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
1ac70 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1ac80 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
1ac90 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
1aca0 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
1acb0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1acc0 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
1acd0 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
1ace0 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
1acf0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
1ad00 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1ad10 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
1ad20 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1ad30 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
1ad40 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
1ad50 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
1ad60 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1ad70 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1ad80 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
1ad90 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
1ada0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1adb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1adc0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1add0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
1ade0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
1adf0 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
1ae00 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
1ae10 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
1ae20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1ae30 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
1ae40 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
1ae50 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
1ae60 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
1ae70 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ae80 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
1ae90 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
1aea0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1aeb0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1aec0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
1aed0 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
1aee0 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
1aef0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1af00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1af10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1af20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1af30 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1af40 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
1af50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1af60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1af70 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
1af80 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1af90 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
1afa0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1afb0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
1afc0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1afd0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
1afe0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
1aff0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
1b000 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
1b010 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
1b020 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
1b030 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
1b040 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
1b050 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
1b060 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1b070 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
1b080 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
1b090 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
1b0a0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
1b0b0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
1b0c0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1b0d0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
1b0e0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
1b0f0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1b100 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1b110 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1b120 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1b130 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
1b140 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
1b150 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b190 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1b1a0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
1b1b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1b1c0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1b1d0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
1b1e0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
1b1f0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
1b200 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
1b210 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
1b220 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1b230 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1b240 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1b250 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1b260 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1b270 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1b280 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1b290 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1b2a0 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1b2b0 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1b2c0 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1b2d0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1b2e0 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1b2f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1b300 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1b310 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1b320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b330 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1b340 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1b350 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1b360 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1b370 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1b380 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1b390 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1b3a0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1b3b0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1b3c0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1b3d0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1b3e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1b3f0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
1b400 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
1b410 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b420 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
1b430 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
1b440 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
1b450 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
1b460 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
1b470 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1b480 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
1b490 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
1b4a0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1b4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1b4c0 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
1b4d0 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
1b4e0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
1b4f0 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
1b500 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1b510 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1b520 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1b530 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1b540 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
1b550 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
1b560 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b580 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1b590 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1b5a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b5b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b5c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1b5d0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
1b5e0 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
1b5f0 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
1b600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1b610 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
1b620 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
1b630 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
1b640 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
1b650 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
1b660 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
1b670 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1b680 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1b690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b6b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b6c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1b6d0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1b6e0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
1b6f0 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
1b700 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
1b710 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1b720 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
1b730 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1b740 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
1b750 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1b760 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
1b770 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
1b780 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1b790 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b7a0 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
1b7b0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1b7c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1b7d0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1b7e0 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
1b7f0 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
1b800 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
1b810 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
1b820 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
1b830 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b840 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
1b850 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
1b860 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1b870 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
1b880 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
1b890 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1b8a0 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
1b8b0 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
1b8c0 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
1b8d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b8e0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
1b8f0 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
1b900 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
1b910 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1b920 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b930 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
1b940 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1b950 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1b980 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
1b990 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
1b9a0 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
1b9b0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
1b9c0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
1b9d0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
1b9e0 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
1b9f0 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
1ba00 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
1ba10 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
1ba20 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
1ba30 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
1ba40 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1ba50 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
1ba60 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1ba70 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
1ba80 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
1ba90 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1baa0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1bab0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
1bac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
1bad0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1bae0 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
1baf0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1bb00 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
1bb10 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
1bb20 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
1bb30 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
1bb40 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1bb50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
1bb60 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
1bb70 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
1bb80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
1bb90 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
1bba0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
1bbb0 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
1bbc0 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
1bbd0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
1bbe0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1bbf0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1bc00 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
1bc10 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
1bc20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1bc30 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
1bc40 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1bc50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1bc60 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
1bc70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bc80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1bc90 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1bca0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
1bcb0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1bcc0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
1bcd0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
1bce0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1bcf0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
1bd00 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
1bd10 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1bd20 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
1bd30 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
1bd40 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1bd50 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1bd60 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
1bd70 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1bd80 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
1bd90 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
1bda0 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
1bdb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bdc0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
1bdd0 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
1bde0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1bdf0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1be00 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1be10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1be20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
1be30 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1be40 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1be50 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1be60 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
1be70 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
1be80 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1be90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1beb0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1bec0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1bed0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1bee0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1bef0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1bf00 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1bf10 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1bf20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1bf30 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
1bf40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bf50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1bf60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1bf70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1bf80 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
1bf90 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
1bfa0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1bfb0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
1bfc0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
1bfd0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
1bfe0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1bff0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1c000 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
1c010 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1c020 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
1c030 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c040 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
1c050 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
1c060 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1c070 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
1c080 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1c090 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
1c0a0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
1c0b0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
1c0c0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
1c0d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c0e0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1c0f0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
1c100 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1c110 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1c120 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1c130 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
1c140 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
1c150 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1c160 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
1c170 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c180 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1c190 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
1c1a0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1c1b0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1c1c0 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
1c1d0 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
1c1e0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1c1f0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
1c200 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1c210 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c220 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
1c230 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
1c240 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
1c250 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c260 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1c270 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
1c280 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
1c290 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
1c2a0 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
1c2b0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1c2c0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
1c2d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1c2e0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
1c2f0 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
1c300 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1c310 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
1c320 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1c330 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
1c340 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
1c350 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1c360 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
1c370 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
1c380 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
1c390 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
1c3a0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
1c3b0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
1c3c0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
1c3d0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
1c3e0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
1c3f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
1c400 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
1c410 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
1c420 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1c430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c440 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c450 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
1c460 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1c470 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1c480 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
1c490 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1c4a0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1c4b0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
1c4c0 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
1c4d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c4e0 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
1c4f0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
1c500 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1c510 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1c520 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
1c530 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
1c540 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
1c550 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
1c560 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1c570 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1c580 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
1c590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
1c5a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
1c5b0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
1c5c0 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
1c5d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c5e0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1c5f0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1c600 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1c610 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1c620 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
1c630 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1c640 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1c650 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
1c660 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1c670 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1c680 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
1c690 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1c6a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
1c6b0 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
1c6c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1c6d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c6e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1c6f0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1c700 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
1c710 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
1c720 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1c730 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
1c740 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1c750 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
1c760 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c770 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
1c780 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1c790 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
1c7a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1c7b0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1c7c0 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
1c7d0 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
1c7e0 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
1c7f0 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
1c800 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
1c810 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
1c820 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
1c830 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
1c840 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
1c850 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
1c860 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
1c870 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
1c880 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
1c890 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
1c8a0 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
1c8b0 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
1c8c0 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
1c8d0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
1c8e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1c8f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
1c900 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
1c910 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
1c920 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
1c930 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
1c940 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
1c950 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
1c960 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
1c970 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1c980 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
1c990 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
1c9a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
1c9b0 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
1c9c0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
1c9d0 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
1c9e0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
1c9f0 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
1ca00 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
1ca10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1ca20 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
1ca30 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
1ca40 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1ca50 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73  eTwo() for the s
1ca60 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
1ca70 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
1ca80 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
1ca90 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
1caa0 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
1cab0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
1cac0 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
1cad0 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
1cae0 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
1caf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1cb00 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
1cb10 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
1cb20 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
1cb30 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1cb40 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
1cb50 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
1cb60 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
1cb70 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
1cb80 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
1cb90 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
1cba0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1cbb0 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
1cbc0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1cbd0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
1cbe0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
1cbf0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1cc00 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
1cc10 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
1cc20 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
1cc30 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
1cc40 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
1cc50 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
1cc60 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
1cc70 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
1cc80 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
1cc90 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
1cca0 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
1ccb0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1ccc0 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
1ccd0 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
1cce0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1ccf0 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
1cd00 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1cd10 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
1cd20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1cd30 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
1cd40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1cd50 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1cd60 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1cd70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1cd80 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
1cd90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1cda0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1cdb0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1cdc0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
1cdd0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1cde0 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
1cdf0 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
1ce00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ce10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ce20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ce30 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
1ce40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ce50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1ce60 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1ce70 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1ce80 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1ce90 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
1cea0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1ceb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1cec0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ced0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
1cee0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
1cef0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
1cf00 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1cf10 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1cf20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1cf30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1cf40 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
1cf50 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1cf60 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
1cf70 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
1cf80 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
1cf90 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
1cfa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cfb0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1cfc0 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
1cfd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1cfe0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1cff0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
1d000 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d010 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1d020 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
1d030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d040 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
1d050 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
1d060 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
1d070 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1d080 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
1d090 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
1d0a0 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
1d0b0 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
1d0c0 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
1d0d0 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1d0e0 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
1d0f0 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
1d100 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1d110 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
1d120 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
1d130 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
1d140 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
1d150 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
1d160 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
1d170 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1d180 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
1d190 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
1d1a0 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1d1b0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
1d1c0 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
1d1d0 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
1d1e0 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
1d1f0 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
1d200 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
1d210 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
1d220 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
1d230 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
1d240 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
1d250 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1d260 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1d270 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
1d280 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
1d290 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
1d2a0 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
1d2b0 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
1d2c0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
1d2d0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1d2e0 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
1d2f0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1d300 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
1d310 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
1d320 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
1d330 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1d340 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
1d350 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1d360 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
1d370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1d380 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
1d390 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
1d3a0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
1d3b0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
1d3c0 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
1d3d0 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
1d3e0 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
1d3f0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1d400 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
1d410 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
1d420 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
1d430 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1d440 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1d450 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
1d460 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
1d470 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
1d480 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
1d490 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
1d4a0 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
1d4b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
1d4c0 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
1d4d0 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
1d4e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1d4f0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
1d500 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1d510 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
1d520 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
1d530 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
1d540 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1d550 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
1d560 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1d570 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
1d580 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
1d590 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
1d5a0 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
1d5b0 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
1d5c0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1d5d0 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
1d5e0 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
1d5f0 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
1d600 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
1d610 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
1d620 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
1d630 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
1d640 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
1d650 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
1d660 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
1d670 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
1d680 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
1d690 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
1d6a0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
1d6b0 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
1d6c0 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
1d6d0 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
1d6e0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
1d6f0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
1d700 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
1d710 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
1d720 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
1d730 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
1d740 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
1d750 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
1d760 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
1d770 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1d780 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
1d790 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
1d7a0 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
1d7b0 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
1d7c0 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
1d7d0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
1d7e0 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
1d7f0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
1d800 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
1d810 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
1d820 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
1d830 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
1d840 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1d850 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
1d860 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
1d870 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
1d880 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1d890 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
1d8a0 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
1d8b0 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
1d8c0 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
1d8d0 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
1d8e0 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
1d8f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1d900 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
1d910 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
1d920 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
1d930 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
1d940 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
1d950 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
1d960 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1d970 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1d980 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1d990 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1d9a0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1d9b0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1d9c0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1d9d0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1d9e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d9f0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
1da00 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
1da10 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
1da20 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1da30 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
1da40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
1da50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1da60 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1da70 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1da80 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
1da90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1daa0 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
1dab0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
1dac0 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
1dad0 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
1dae0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1daf0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
1db00 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1db10 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1db20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1db30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1db40 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1db50 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1db60 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1db70 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
1db80 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
1db90 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
1dba0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1dbb0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1dbc0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1dbd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dbe0 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
1dbf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1dc00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1dc10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1dc20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  c;.    }.    p->
1dc30 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20  iDataVersion--; 
1dc40 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66   /* Compensate f
1dc50 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  or pPager->iData
1dc60 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20  Version++; */.  
1dc70 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1dc80 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1dc90 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
1dca0 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
1dcb0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1dcc0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1dcd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1dce0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1dcf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1dd00 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
1dd10 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
1dd20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dd30 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
1dd40 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1dd50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1dd60 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1dd70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1dd80 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
1dd90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1dda0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1ddb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1ddc0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
1ddd0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1dde0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1ddf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1de00 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1de10 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
1de20 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
1de30 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
1de40 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
1de50 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
1de60 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61  sor on any BtSha
1de70 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
1de80 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  ** references.  
1de90 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f  Or if the writeO
1dea0 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  nly flag is set 
1deb0 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a  to 1, then only.
1dec0 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75  ** trip write cu
1ded0 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20  rsors and leave 
1dee0 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63  read cursors unc
1def0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76  hanged..**.** Ev
1df00 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20  ery cursor is a 
1df10 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
1df20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
1df30 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68  ng cursors.** th
1df40 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68  at belong to oth
1df50 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1df60 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
1df70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61  pen to be.** sha
1df80 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77  ring the cache w
1df90 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
1dfa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1dfb0 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
1dfc0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1dfd0 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  s. If the writeO
1dfe0 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  nly.** flag is t
1dff0 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  rue, then only w
1e000 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65  rite-cursors nee
1e010 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72  d be tripped - r
1e020 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
1e030 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63  ors save their c
1e040 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73  urrent positions
1e050 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61   so that they ma
1e060 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66  y continue .** f
1e070 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c  ollowing the rol
1e080 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72  lback. Or, if wr
1e090 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
1e0a0 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  , all cursors ar
1e0b0 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49  e .** tripped. I
1e0c0 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65  n general, write
1e0d0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66  Only is false if
1e0e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e0f0 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64   being.** rolled
1e100 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74   back modified t
1e110 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1e120 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ma. In this case
1e130 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20   b-tree root.** 
1e140 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76  pages may be mov
1e150 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72  ed or deleted fr
1e160 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e170 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69  altogether, maki
1e180 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20  ng.** it unsafe 
1e190 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73  for read cursors
1e1a0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a   to continue..**
1e1b0 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65  .** If the write
1e1c0 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75  Only flag is tru
1e1d0 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69  e and an error i
1e1e0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
1e1f0 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74  ile .** saving t
1e200 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
1e210 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e  ion of a read-on
1e220 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63  ly cursor, all c
1e230 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c  ursors, .** incl
1e240 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63  uding all read-c
1e250 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
1e260 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ed..**.** SQLITE
1e270 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1e280 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
1e290 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
1e2a0 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61  curs while.** sa
1e2b0 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f  ving a cursor po
1e2c0 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74  sition, an SQLit
1e2d0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
1e2e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e2f0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1e300 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
1e310 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20  nt errCode, int 
1e320 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74  writeOnly){.  Bt
1e330 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74  Cursor *p;.  int
1e340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e350 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69  ..  assert( (wri
1e360 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69  teOnly==0 || wri
1e370 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54  teOnly==1) && BT
1e380 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20  CF_WriteFlag==1 
1e390 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
1e3a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
1e3b0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1e3c0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72  ;.    for(p=pBtr
1e3d0 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1e3e0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1e3f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1e400 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e       if( writeOn
1e410 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61  ly && (p->curFla
1e420 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
1e430 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lag)==0 ){.     
1e440 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
1e450 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
1e460 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
1e470 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
1e480 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1e490 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
1e4a0 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(p);.          
1e4b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e4c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1e4d0 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74   (void)sqlite3Bt
1e4e0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1e4f0 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29  s(pBtree, rc, 0)
1e500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1e510 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1e520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e540 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1e550 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
1e560 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
1e570 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
1e580 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78        p->skipNex
1e590 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20  t = errCode;.   
1e5a0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
1e5b0 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
1e5c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
1e5d0 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70  eleasePage(p->ap
1e5e0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
1e5f0 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
1e600 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1e610 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1e620 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1e630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1e650 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
1e660 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
1e670 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f  .**.** If tripCo
1e680 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  de is not SQLITE
1e690 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73  _OK then cursors
1e6a0 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64   will be invalid
1e6b0 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a  ated (tripped)..
1e6c0 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
1e6d0 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65  rsors are trippe
1e6e0 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
1e6f0 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63  s true but all c
1e700 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72  ursors are.** tr
1e710 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e  ipped if writeOn
1e720 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e  ly is false.  An
1e730 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
1e740 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75  .** a tripped cu
1e750 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74  rsor will result
1e760 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   in an error..**
1e770 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1e780 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1e790 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1e7a0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1e7b0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1e7c0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1e7d0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1e7e0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1e7f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e800 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65  eeRollback(Btree
1e810 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64   *p, int tripCod
1e820 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
1e830 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1e840 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1e850 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1e860 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73   *pPage1;..  ass
1e870 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  ert( writeOnly==
1e880 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  1 || writeOnly==
1e890 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1e8a0 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
1e8b0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  ABORT_ROLLBACK |
1e8c0 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  | tripCode==SQLI
1e8d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74  TE_OK );.  sqlit
1e8e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1e8f0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d  .  if( tripCode=
1e900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e910 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20    rc = tripCode 
1e920 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1e930 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1e940 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f   if( rc ) writeO
1e950 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nly = 0;.  }else
1e960 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1e970 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1e980 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20  tripCode ){.    
1e990 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65  int rc2 = sqlite
1e9a0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1e9b0 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65  sors(p, tripCode
1e9c0 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20  , writeOnly);.  
1e9d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1e9e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74  LITE_OK || (writ
1e9f0 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d  eOnly==0 && rc2=
1ea00 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20  =SQLITE_OK) );. 
1ea10 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
1ea20 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
1ea30 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74  ;.  }.  btreeInt
1ea40 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
1ea50 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1ea60 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1ea70 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
1ea80 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
1ea90 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
1eaa0 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
1eab0 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
1eac0 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
1ead0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1eae0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
1eaf0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
1eb00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1eb10 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1eb20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
1eb30 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
1eb40 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
1eb50 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
1eb60 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
1eb70 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
1eb80 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
1eb90 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
1eba0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
1ebb0 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
1ebc0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
1ebd0 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
1ebe0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
1ebf0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1ec00 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
1ec10 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65  aData);.      te
1ec20 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
1ec30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
1ec40 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  age==0 ) sqlite3
1ec50 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1ec60 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
1ec70 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ge);.      testc
1ec80 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
1ec90 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =nPage );.      
1eca0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
1ecb0 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  ge;.      releas
1ecc0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
1ecd0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1ece0 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1ecf0 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
1ed00 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1ed10 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1ed20 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1ed30 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1ed40 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1ed50 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1ed60 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1ed70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1ed80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ed90 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
1eda0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1edb0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1edc0 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f  action can be ro
1edd0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
1ede0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
1edf0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1ee00 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
1ee10 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1ee20 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
1ee30 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
1ee40 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1ee50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
1ee60 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1ee70 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
1ee80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
1ee90 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
1eea0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
1eeb0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1eec0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1eed0 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1eee0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1eef0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1ef00 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1ef10 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1ef20 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1ef30 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1ef40 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1ef50 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1ef60 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1ef70 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1ef80 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1ef90 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1efa0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1efb0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1efc0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1efd0 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1efe0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1eff0 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1f000 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1f010 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1f020 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1f030 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1f040 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1f050 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1f060 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1f070 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1f080 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1f090 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1f0a0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1f0b0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1f0c0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1f0d0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1f0e0 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1f0f0 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1f100 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1f110 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1f120 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1f130 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1f140 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1f150 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1f160 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1f170 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1f180 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1f190 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1f1a0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1f1b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f1c0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1f1d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1f1e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1f1f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f200 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
1f210 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1f220 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
1f230 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1f240 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
1f250 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1f260 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
1f270 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
1f280 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1f290 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1f2a0 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
1f2b0 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
1f2c0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1f2d0 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
1f2e0 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
1f2f0 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
1f300 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
1f310 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
1f320 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
1f330 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
1f340 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
1f350 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
1f360 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1f370 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
1f380 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
1f390 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1f3a0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
1f3b0 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
1f3c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1f3d0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1f3e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
1f3f0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71  Statement);.  sq
1f400 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f410 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1f420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
1f430 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
1f440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
1f450 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
1f460 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1f470 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
1f480 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
1f490 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
1f4a0 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
1f4b0 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
1f4c0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
1f4d0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
1f4e0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
1f4f0 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
1f500 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
1f510 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
1f520 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
1f530 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1f540 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
1f550 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
1f560 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1f570 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
1f580 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
1f590 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
1f5a0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
1f5b0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
1f5c0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
1f5d0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
1f5e0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
1f5f0 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
1f600 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
1f610 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
1f620 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
1f630 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
1f640 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
1f650 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1f660 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1f670 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
1f680 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
1f690 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f6a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1f6b0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1f6c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1f6d0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1f6e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1f6f0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
1f700 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
1f710 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
1f720 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
1f730 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
1f740 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
1f750 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
1f760 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1f770 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1f780 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1f790 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f7a0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
1f7b0 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
1f7c0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1f7d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f7e0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1f7f0 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
1f800 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1f810 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1f820 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
1f830 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f840 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1f850 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1f860 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
1f870 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
1f880 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
1f890 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
1f8a0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1f8b0 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
1f8c0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
1f8d0 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
1f8e0 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
1f8f0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
1f900 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
1f910 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1f920 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
1f930 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
1f940 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
1f950 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1f960 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
1f970 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f980 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1f990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f9a0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1f9b0 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
1f9c0 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
1f9d0 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
1f9e0 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
1f9f0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1fa00 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1fa10 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1fa20 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
1fa30 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
1fa40 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
1fa50 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
1fa60 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
1fa70 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
1fa80 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
1fa90 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1faa0 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
1fab0 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
1fac0 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1fad0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
1fae0 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
1faf0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
1fb00 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
1fb10 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1fb20 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
1fb30 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
1fb40 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
1fb50 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
1fb60 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
1fb70 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
1fb80 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
1fb90 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
1fba0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
1fbb0 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
1fbc0 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
1fbd0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
1fbe0 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
1fbf0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
1fc00 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
1fc10 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
1fc20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
1fc30 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
1fc40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1fc50 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
1fc60 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
1fc70 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
1fc80 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
1fc90 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
1fca0 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
1fcb0 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
1fcc0 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
1fcd0 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
1fce0 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
1fcf0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
1fd00 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
1fd10 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
1fd20 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
1fd30 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
1fd40 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
1fd50 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
1fd60 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1fd70 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
1fd80 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
1fd90 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
1fda0 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
1fdb0 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
1fdc0 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
1fdd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1fde0 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
1fdf0 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
1fe00 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
1fe10 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
1fe20 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1fe30 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
1fe40 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1fe50 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
1fe60 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
1fe70 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1fe80 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
1fe90 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1fea0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1feb0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
1fec0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
1fed0 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
1fee0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
1fef0 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
1ff00 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1ff10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ff20 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
1ff30 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1ff60 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1ff70 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1ffa0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1ffb0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1ffe0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1fff0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
20000 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
20010 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
20020 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
20030 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
20040 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
20050 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
20080 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
20090 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
200a0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
200b0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
200c0 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
200d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
200e0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
200f0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
20100 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
20110 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
20120 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
20130 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
20140 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
20150 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
20160 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
20170 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
20180 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
20190 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
201a0 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
201b0 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
201c0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
201d0 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
201e0 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
201f0 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
20200 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
20210 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
20220 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
20230 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
20240 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
20250 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
20260 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
20270 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
20280 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
20290 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
202a0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
202b0 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
202c0 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
202d0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
202e0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
202f0 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
20300 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
20310 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
20320 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
20330 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
20340 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
20350 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20  aData );..  if( 
20360 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20  NEVER(wrFlag && 
20370 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
20380 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
20390 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
203a0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
203b0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46  Y;.  }.  if( wrF
203c0 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
203d0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
203e0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
203f0 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
20400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
20410 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  EM;.  }.  if( iT
20420 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
20430 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
20440 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
20450 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
20460 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
20470 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
20480 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
20490 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
204a0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
204b0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
204c0 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
204d0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
204e0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
204f0 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
20500 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
20510 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
20520 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
20530 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
20540 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
20550 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
20560 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
20570 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  t;.  assert( wrF
20580 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
20590 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ==BTCF_WriteFlag
205a0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   );.  pCur->curF
205b0 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20  lags = wrFlag;. 
205c0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
205d0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
205e0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
205f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
20600 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
20610 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
20620 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
20630 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
20640 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
20650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20660 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
20670 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
20680 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
206b0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
206c0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
206f0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
20700 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
20710 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
20740 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
20750 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
20760 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20780 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
20790 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
207a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
207d0 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
207e0 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
207f0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61  nt rc;.  if( iTa
20800 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20  ble<1 ){.    rc 
20810 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
20820 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
20830 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20840 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
20850 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
20860 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
20870 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
20880 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
20890 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
208a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
208b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
208c0 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
208d0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
208e0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
208f0 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
20900 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
20910 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
20920 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
20930 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
20940 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
20950 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
20960 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
20970 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
20980 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
20990 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
209a0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
209b0 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
209c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
209d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
209e0 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
209f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
20a00 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
20a10 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
20a20 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
20a30 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
20a40 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
20a50 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
20a60 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
20a70 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
20a80 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
20a90 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
20aa0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
20ab0 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
20ac0 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
20ad0 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
20ae0 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
20af0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
20b00 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
20b10 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
20b20 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
20b30 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
20b40 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
20b50 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
20b60 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
20b70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
20b80 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
20b90 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
20ba0 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
20bb0 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
20bc0 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
20bd0 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
20be0 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
20bf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20c00 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
20c10 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
20c20 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
20c30 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
20c40 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
20c50 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
20c60 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
20c70 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
20c80 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
20c90 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
20ca0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20cb0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20  = pCur->pBt;.   
20cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
20cd0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
20ce0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
20cf0 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
20d00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72     if( pCur->pPr
20d10 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ev ){.      pCur
20d20 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
20d30 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
20d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20d50 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
20d60 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
20d70 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
20d80 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Next ){.      pC
20d90 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
20da0 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
20db0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
20dc0 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
20dd0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
20de0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
20df0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
20e00 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
20e10 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
20e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
20e30 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
20e40 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
20e50 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
20e60 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
20e70 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
20e80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20e90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20ea0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
20eb0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
20ec0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
20ed0 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
20ee0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
20ef0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
20f00 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
20f10 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
20f20 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
20f30 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
20f40 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
20f50 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
20f60 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
20f70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
20f80 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
20f90 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
20fa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
20fb0 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
20fc0 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
20fd0 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
20fe0 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
20ff0 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
21000 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
21010 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
21020 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
21030 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
21040 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
21050 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
21060 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
21070 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
21080 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
21090 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
210a0 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
210b0 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
210c0 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
210d0 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
210e0 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
210f0 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 67  is not doing agg
21100 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
21110 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
21120 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
21130 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
21140 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
21150 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
21160 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
21170 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
21180 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
21190 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
211a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
211b0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
211c0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
211d0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
211e0 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
211f0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
21200 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
21210 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
21220 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
21230 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
21240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  ;.    assert( CO
21250 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63  RRUPT_DB || memc
21260 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
21270 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
21280 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
21290 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
212a0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
212b0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
212c0 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
212d0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
212e0 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
212f0 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
21300 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
21310 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
21320 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
21330 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
21340 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
21350 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
21360 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
21370 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
21380 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
21390 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
213a0 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
213b0 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
213c0 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
213d0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
213e0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
213f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21400 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
21410 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
21420 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
21430 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
21440 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
21450 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
21460 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
21470 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
21480 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
21490 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
214e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
214f0 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
21530 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
21540 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65        \.    btre
21580 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
21590 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
215a0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
215b0 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
215c0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75         \.    pCu
215d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
215e0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20  TCF_ValidNKey;  
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21610 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
21620 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
21670 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
21680 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
216c0 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
216d0 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  ER */..#ifndef N
216e0 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
216f0 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
21700 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
21710 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
21720 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
21730 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
21740 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
21750 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
21760 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
21770 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
21780 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
21790 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
217a0 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
217b0 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
217c0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
217d0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
217e0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
217f0 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
21800 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
21810 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
21820 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
21830 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
21840 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21850 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
21860 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
21870 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
21880 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
21890 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
218a0 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
218b0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
218c0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
218d0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
218e0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
218f0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
21900 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
21910 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
21920 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
21930 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
21940 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
21950 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
21960 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
21970 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
21980 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
21990 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
219a0 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
219b0 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
219c0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
219d0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
219e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
219f0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
21a00 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
21a10 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
21a20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21a30 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
21a40 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
21a50 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
21a60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21a70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21a80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21a90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21aa0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
21ab0 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
21ac0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
21ad0 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53  nKey;.  return S
21ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21af0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
21b00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
21b10 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
21b20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
21b30 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
21b40 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
21b50 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
21b60 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
21b70 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
21b80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
21b90 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
21ba0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
21bb0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
21bc0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
21bd0 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
21be0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
21bf0 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
21c00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
21c10 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
21c20 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
21c30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
21c40 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
21c50 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
21c60 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
21c70 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
21c80 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
21c90 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
21ca0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
21cb0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
21cc0 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
21cd0 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
21ce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21cf0 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
21d00 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
21d10 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
21d20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21d30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21d40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
21d50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21d70 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
21d80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
21d90 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
21da0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
21db0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
21dc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
21dd0 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b  intKeyLeaf==1 );
21de0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
21df0 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
21e00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
21e10 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
21e20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21e30 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
21e40 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
21e50 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
21e60 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
21e70 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
21e80 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21e90 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
21ea0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
21eb0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
21ec0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
21ed0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
21ee0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
21ef0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
21f00 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
21f10 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
21f20 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
21f30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
21f40 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
21f50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21f60 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
21f70 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
21f80 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
21f90 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
21fa0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
21fb0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
21fc0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
21fd0 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
21fe0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
21ff0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
22000 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
22010 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
22020 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
22030 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
22040 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
22050 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
22060 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
22070 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
22080 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
22090 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
220a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
220b0 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
220c0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
220d0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
220e0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
220f0 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
22100 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
22110 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
22120 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
22130 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
22140 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
22150 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
22160 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
22170 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
22180 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
22190 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
221a0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
221b0 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
221c0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
221d0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
221e0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
221f0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
22200 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
22210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22230 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
22260 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
22270 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
22280 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
22290 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
222a0 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
222b0 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
222c0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
222d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
222e0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
222f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
22300 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
22310 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
22320 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
22330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22340 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22350 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
22360 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
22370 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
22380 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
22390 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
223a0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
223b0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
223c0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
223d0 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
223e0 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
223f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
22400 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
22410 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
22420 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
22430 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
22440 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
22450 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
22460 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
22470 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
22480 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
22490 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
224a0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
224b0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
224c0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
224d0 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
224e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
224f0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
22500 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
22510 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
22520 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
22530 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
22540 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
22550 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
22560 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
22570 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
22580 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
22590 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
225a0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
225b0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
225c0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
225d0 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
225e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
225f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22600 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
22610 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
22620 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
22630 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
22640 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
22650 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
22660 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
22670 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
22680 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
22690 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
226a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
226b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
226c0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
226d0 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
226e0 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
226f0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
22700 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
22710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
22720 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
22730 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22740 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
22750 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
22760 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
22770 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
22780 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
22790 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
227a0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
227b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
227c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
227d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
227e0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
227f0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
22800 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
22810 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
22820 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
22830 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
22840 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
22850 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
22860 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
22870 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
22880 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
22890 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
228a0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
228b0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
228c0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
228d0 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
228e0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
228f0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
22900 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
22910 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
22920 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
22930 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
22940 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
22950 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
22960 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
22970 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
22980 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
22990 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
229a0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
229b0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
229c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
229d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
229e0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
229f0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
22a00 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22a10 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
22a20 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
22a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22a40 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
22a50 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
22a80 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
22a90 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
22aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
22ab0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
22ac0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
22ad0 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
22ae0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
22af0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
22b00 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
22b10 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
22b20 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
22b30 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
22b40 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
22b50 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
22b60 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
22b70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
22b80 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
22b90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22bb0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
22bc0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
22bd0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
22be0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
22bf0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
22c00 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
22c10 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
22c20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
22c30 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
22c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
22c50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22c60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22c70 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
22c80 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
22c90 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
22ca0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
22cb0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
22cc0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
22cd0 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
22ce0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
22cf0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
22d00 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
22d10 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
22d20 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
22d30 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
22d40 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
22d50 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
22d60 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
22d70 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
22d80 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
22d90 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
22da0 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
22db0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
22dc0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
22dd0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
22de0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
22df0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
22e00 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
22e10 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
22e20 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
22e30 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
22e40 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
22e50 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
22e60 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
22e70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
22e80 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
22e90 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
22ea0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
22eb0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
22ec0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
22ed0 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
22ee0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
22ef0 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
22f00 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
22f10 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
22f20 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
22f30 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
22f40 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
22f50 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
22f60 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
22f70 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
22f80 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
22f90 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
22fa0 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
22fb0 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
22fc0 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
22fd0 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
22fe0 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
22ff0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
23000 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
23010 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
23020 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
23030 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
23040 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
23050 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
23060 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
23070 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
23080 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
23090 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
230a0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
230b0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
230c0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
230d0 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
230e0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
230f0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
23100 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
23110 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
23120 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
23130 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
23140 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
23150 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
23160 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
23170 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
23180 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
23190 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
231a0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
231b0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
231c0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
231d0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
231e0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
231f0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
23200 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
23210 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
23220 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
23230 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
23240 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
23250 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
23260 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
23270 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
23280 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
23290 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
232a0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
232b0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
232c0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
232d0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
232e0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
232f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
23300 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
23310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23320 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
23330 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
23340 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23350 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
23360 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
23370 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
23380 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23390 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
233a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
233b0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
233c0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
233d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
233e0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
233f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
23400 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
23410 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
23420 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
23450 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
23460 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
23470 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
23480 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
23490 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
234a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
234b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
234c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
234d0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
234e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
234f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23500 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23510 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
23520 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
23530 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
23540 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
23550 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
23560 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
23570 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
23580 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
23590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
235a0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
235b0 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
235c0 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
235d0 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
235e0 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
235f0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
23600 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
23610 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c 6f  ;..  if( &aPaylo
23620 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
23630 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
23640 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
23650 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a  eSize] ){.    /*
23660 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
23670 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
23680 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
23690 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
236a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
236b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
236c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
236d0 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
236e0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
236f0 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
23700 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
23710 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
23720 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
23730 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
23740 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
23750 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
23760 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
23770 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
23780 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
23790 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
237a0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
237b0 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
237c0 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30  f, a, (eOp & 0x0
237d0 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  1), pPage->pDbPa
237e0 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
237f0 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
23800 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
23810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
23820 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
23830 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
23840 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
23850 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
23860 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
23870 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
23880 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
23890 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
238a0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
238b0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
238c0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
238d0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
238e0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
238f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
23900 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
23910 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
23920 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
23930 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
23940 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
23950 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
23960 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
23970 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
23980 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23990 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
239a0 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
239b0 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
239c0 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
239d0 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
239e0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
239f0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
23a00 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
23a10 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
23a20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
23a30 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
23a40 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
23a50 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
23a60 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
23a70 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
23a80 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
23a90 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
23aa0 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
23ab0 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
23ac0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
23ad0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
23ae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
23af0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
23b00 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
23b10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23b20 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
23b30 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
23b40 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
23b50 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
23b60 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
23b70 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
23b80 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
23b90 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
23ba0 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
23bb0 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
23bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
23bd0 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
23be0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23bf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
23c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23c10 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f   pCur->nOvflAllo
23c20 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20  c = nOvfl*2;.   
23c30 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
23c40 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20  erflow = aNew;. 
23c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23c60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
23c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23c80 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d      memset(pCur-
23c90 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e  >aOverflow, 0, n
23ca0 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  Ovfl*sizeof(Pgno
23cb0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  ));.        pCur
23cc0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
23cd0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
23ce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23cf0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
23d00 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
23d10 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
23d20 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
23d30 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
23d40 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
23d50 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
23d60 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
23d70 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
23d80 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
23d90 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
23da0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
23db0 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20  idOvfl)!=0.     
23dc0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
23dd0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
23de0 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze].    ){.     
23df0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
23e00 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
23e10 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
23e20 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
23e30 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
23e40 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
23e50 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ze);.    }..    
23e60 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
23e70 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
23e80 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
23e90 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  +){..      /* If
23ea0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
23eb0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
23ec0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
23ed0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
23ee0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
23ef0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
23f00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
23f10 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
23f20 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
23f30 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23f40 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
23f50 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
23f60 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
23f70 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
23f80 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f    }..      if( o
23f90 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
23fa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
23fb0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
23fc0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
23fd0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
23fe0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
23ff0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
24000 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
24010 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
24020 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
24030 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
24040 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
24050 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
24060 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
24070 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
24080 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
24090 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
240a0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
240b0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
240c0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
240d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
240e0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
240f0 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
24100 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c  array must be al
24110 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20  located because 
24120 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a  eOp!=2.        *
24130 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d  * here.  If eOp=
24140 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d  =2, then offset=
24150 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e  =0 and this bran
24160 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65  ch is never take
24170 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
24180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
24190 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  p!=2 );.        
241a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
241b0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
241c0 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20  lidOvfl );.     
241d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
241e0 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74  >pBtree->db==pBt
241f0 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20  ->db );.        
24200 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
24210 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
24220 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
24230 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
24240 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
24250 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24260 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
24270 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
24280 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
24290 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
242a0 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65   }.        offse
242b0 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
242c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
242d0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
242e0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
242f0 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
24300 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
24310 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
24320 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
24330 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
24340 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
24350 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
24360 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
24370 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
24380 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
24390 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
243a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
243b0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
243c0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
243d0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
243e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
243f0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
24400 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
24410 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
24420 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
24430 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
24440 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
24450 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
24460 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
24470 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
24480 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
24490 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
244a0 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
244b0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
244c0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
244d0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
244e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
244f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24500 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
24510 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
24520 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  ) there is no op
24530 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  en write-transac
24540 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
24550 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61    **   5) the da
24560 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20  tabase is not a 
24570 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20  WAL database,.  
24580 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c        **   6) al
24590 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
245a0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 65  page is being re
245b0 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ad..        **  
245c0 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20 62   7) at least 4 b
245d0 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ytes have alread
245e0 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f  y been read into
245f0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
24600 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  er .        **. 
24610 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
24620 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20  ata can be read 
24630 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
24640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24650 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
24660 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65   ** output buffe
24670 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  r, bypassing the
24680 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f   page-cache alto
24690 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65  gether. This spe
246a0 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  eds.        ** u
246b0 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20  p loading large 
246c0 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61  records that spa
246d0 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  n many overflow 
246e0 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  pages..        *
246f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  /.        if( (e
24700 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20  Op&0x01)==0     
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
24740 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30      && offset==0
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
24780 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
24790 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c  (bEnd || a==ovfl
247a0 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20 20  Size)           
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
247d0 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e        && pBt->in
247e0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
247f0 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  NS_READ         
24800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
24810 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  4) */.         &
24820 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50  & (fd = sqlite3P
24830 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
24840 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73  ager))->pMethods
24850 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
24860 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
24870 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39  pPage1->aData[19
24880 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20  ]==0x01         
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
248a0 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (5) */.        
248b0 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70   && &pBuf[-4]>=p
248c0 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20  BufStart        
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f         /* (7) */
248f0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
24900 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
24910 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
24920 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
24930 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -4];.          a
24940 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70  ssert( aWrite>=p
24950 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20  BufStart );     
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29      /* hence (7)
24980 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
24990 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
249a0 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
249b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
249c0 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
249d0 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
249e0 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
249f0 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
24a00 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
24a10 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
24a20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
24a30 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
24a40 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
24a50 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
24a60 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
24a70 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
24a80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24a90 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
24aa0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
24ab0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
24ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24ad0 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f  ((eOp&0x01)==0 ?
24ae0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
24af0 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
24b00 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
24b10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24b20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
24b30 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
24b40 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
24b50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
24b60 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
24b70 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
24b80 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
24b90 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
24ba0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
24bb0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
24bc0 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50  (eOp&0x01), pDbP
24bd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24be0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
24bf0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
24c00 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
24c10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
24c20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24c30 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
24c40 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
24c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24c60 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
24c70 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
24c80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
24c90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24ca0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
24cb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
24cc0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
24cd0 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
24ce0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
24cf0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
24d00 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
24d10 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f  transferred into
24d20 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
24d30 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
24d40 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
24d50 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
24d60 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
24d70 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
24d80 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a   to a valid row.
24d90 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ** in the table.
24da0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
24db0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
24dc0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
24dd0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
24de0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
24df0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
24e00 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
24e10 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
24e20 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
24e30 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
24e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24e50 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
24e60 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
24e70 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
24e80 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
24e90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24ea0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24eb0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24ec0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24ed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24ee0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
24ef0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24f00 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
24f10 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
24f20 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
24f30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24f40 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
24f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
24f60 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
24f70 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
24f80 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
24f90 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
24fa0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
24fb0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
24fc0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
24fd0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
24fe0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
24ff0 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
25000 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
25010 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
25020 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
25030 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
25040 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
25050 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
25060 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
25070 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
25080 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
25090 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
250a0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
250b0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
250c0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
250d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
250e0 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
250f0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
25100 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
25110 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
25120 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25130 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
25140 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
25150 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
25160 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
25170 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
25180 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
25190 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
251a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
251b0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
251c0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
251d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
251e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
251f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25200 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25210 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25220 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
25230 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
25240 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
25250 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25260 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25270 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
25280 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25290 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
252a0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
252b0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
252c0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
252d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
252e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
252f0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
25300 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
25310 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
25320 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
25330 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
25340 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
25350 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
25360 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
25370 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
25380 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
25390 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
253a0 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
253b0 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
253c0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
253d0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
253e0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
253f0 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
25400 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
25410 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
25420 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
25430 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
25440 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
25450 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
25460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25470 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
25480 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
25490 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
254a0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
254b0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
254c0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
254d0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
254e0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
254f0 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
25500 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
25510 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
25520 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
25530 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
25540 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
25550 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
25560 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
25570 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
25580 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
25590 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
255a0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
255b0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
255c0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
255d0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
255e0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
255f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
25600 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
25610 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
25620 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
25630 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
25640 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
25650 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
25660 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
25670 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
25680 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
25690 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
256a0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
256b0 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
256c0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
256d0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
256e0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
256f0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
25700 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
25710 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
25720 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
25730 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
25740 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
25750 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
25760 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
25770 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
25780 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
25790 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
257a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
257b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
257c0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
257d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
257e0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
257f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
25800 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25810 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25830 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25840 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
25850 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25860 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
25870 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
25880 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Size>0 );.  asse
25890 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
258a0 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70  Payload>pCur->ap
258b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
258c0 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52  ]->aData || CORR
258d0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
258e0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
258f0 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70  Payload<pCur->ap
25900 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25910 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f  ]->aDataEnd ||CO
25920 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74  RRUPT_DB);.  amt
25930 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61   = (int)(pCur->a
25940 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25950 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  e]->aDataEnd - p
25960 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
25970 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ad);.  if( pCur-
25980 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74  >info.nLocal<amt
25990 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69   ) amt = pCur->i
259a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70  nfo.nLocal;.  *p
259b0 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74  Amt = amt;.  ret
259c0 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
259d0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
259e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
259f0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
25a00 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
25a10 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
25a20 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
25a30 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
25a40 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
25a50 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
25a60 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
25a70 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
25a80 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
25a90 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
25aa0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
25ab0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
25ac0 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
25ad0 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
25ae0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
25af0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
25b00 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
25b10 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
25b20 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
25b30 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
25b40 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
25b50 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
25b60 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
25b70 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
25b80 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
25b90 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
25ba0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
25bb0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
25bc0 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
25bd0 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
25be0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
25bf0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
25c00 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
25c10 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
25c20 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
25c30 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
25c40 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
25c50 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
25c60 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
25c70 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
25c80 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76  pAmt);.}.const v
25c90 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
25ca0 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
25cb0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
25cc0 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
25cd0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
25ce0 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
25cf0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
25d00 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
25d10 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
25d20 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
25d30 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
25d40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
25d50 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
25d60 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
25d70 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
25d80 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
25d90 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
25da0 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
25db0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
25dc0 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
25dd0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
25de0 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
25df0 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
25e00 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
25e10 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
25e20 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
25e30 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
25e40 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
25e50 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
25e60 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
25e70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
25e80 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
25e90 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d  nt rc;.  int i =
25ea0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
25eb0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
25ec0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
25ed0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
25ee0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25ef0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25f00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25f10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25f20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
25f30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
25f40 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
25f50 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
25f60 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
25f70 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
25f80 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
25f90 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
25fa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
25fb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25fc0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
25fd0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
25fe0 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
25ff0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
26000 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c      (pCur->curFl
26010 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
26020 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52  Flag)==0 ? PAGER
26030 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26040 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
26050 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
26060 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
26070 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
26080 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
26090 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
260a0 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
260b0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
260c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
260d0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
260e0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
260f0 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
26100 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65  ->nCell<1 || pNe
26110 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70  wPage->intKey!=p
26120 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
26130 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
26140 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
26150 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
26160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26170 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
26180 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
26190 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
261a0 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
261b0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
261c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
261d0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
261e0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
261f0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
26200 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
26210 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
26220 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
26230 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
26240 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
26250 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
26260 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
26270 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
26280 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
26290 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
262a0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
262b0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
262c0 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
262d0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
262e0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
262f0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
26300 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
26310 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
26320 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
26330 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
26360 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
26370 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
26380 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
26390 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
263a0 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
263b0 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
263c0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
263d0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
263e0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
263f0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
26400 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
26410 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
26420 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
26430 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
26440 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
26450 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
26460 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
26470 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
26480 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
26490 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
264a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
264b0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
264c0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
264d0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
264e0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
264f0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
26500 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
26510 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
26520 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
26530 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
26540 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
26550 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
26560 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
26570 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
26580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
26590 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
265a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
265b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
265c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
265d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
265e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
265f0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
26600 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
26610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26620 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26630 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
26640 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
26650 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
26660 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
26670 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
26680 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
26690 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
266a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
266b0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
266c0 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
266d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
266e0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
266f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
26700 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65  ->nCell );..  re
26710 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
26720 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26730 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
26740 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
26750 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
26760 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
26770 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
26780 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
26790 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  fl);.}../*.** Mo
267a0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
267b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
267c0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
267d0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
267e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
267f0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
26800 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
26810 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
26820 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
26830 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
26840 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
26850 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
26860 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
26870 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
26880 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
26890 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
268a0 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
268b0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
268c0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
268d0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
268e0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
268f0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
26900 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
26910 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
26920 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
26930 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
26940 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
26950 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
26960 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
26970 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
26980 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
26990 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
269a0 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
269b0 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
269c0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
269d0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
269e0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
269f0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
26a00 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
26a10 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
26a20 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
26a30 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
26a40 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
26a50 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
26a60 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
26a70 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
26a80 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
26a90 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
26aa0 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
26ab0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
26ac0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
26ad0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
26ae0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
26af0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
26b00 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
26b10 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
26b20 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
26b30 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
26b40 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
26b50 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
26b60 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
26b70 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
26b80 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
26b90 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
26ba0 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
26bb0 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
26bc0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
26bd0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
26be0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
26bf0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
26c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
26c10 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26c20 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26c30 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
26c40 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
26c50 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
26c60 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
26c70 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
26c80 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26c90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
26ca0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
26cb0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26cc0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
26cd0 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
26ce0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
26cf0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
26d00 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
26d10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26d20 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
26d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
26d40 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
26d50 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
26d60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
26d70 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
26d80 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
26d90 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
26da0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
26db0 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61  r->iPage ) relea
26dc0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
26dd0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
26de0 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  -]);.  }else if(
26df0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
26e00 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
26e10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
26e20 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
26e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26e50 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
26e60 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
26e70 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
26e80 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
26e90 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
26ea0 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
26eb0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
26ec0 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
26ed0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
26ee0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
26ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26f00 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
26f10 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
26f20 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
26f30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
26f40 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
26f50 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
26f60 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
26f70 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
26f80 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
26f90 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Root );..  /* If
26fa0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
26fb0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
26fc0 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
26fd0 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
26fe0 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74  rsor.  ** expect
26ff0 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
27000 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
27010 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
27020 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a  pKeyInfo is.  **
27030 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
27040 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
27050 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
27060 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
27070 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  e,.  ** return a
27080 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27090 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20   error. .  **.  
270a0 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ** Earlier versi
270b0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73  ons of SQLite as
270c0 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20  sumed that this 
270d0 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66  test could not f
270e0 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ail.  ** if the 
270f0 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c  root page was al
27100 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65  ready loaded whe
27110 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27120 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e  was called (i.e.
27130 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69  .  ** if pCur->i
27140 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68  Page>=0). But th
27150 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20  is is not so if 
27160 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
27170 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20  corrupted .  ** 
27180 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
27190 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73  at page pRoot is
271a0 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73   linked into a s
271b0 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62  econd b-tree tab
271c0 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65  le .  ** (or the
271d0 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a   freelist).  */.
271e0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
271f0 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52  >intKey==1 || pR
27200 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  oot->intKey==0 )
27210 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69  ;.  if( pRoot->i
27220 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75  sInit==0 || (pCu
27230 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
27240 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
27250 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
27260 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27270 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61  ;.  }..  pCur->a
27280 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
27290 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
272a0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
272b0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
272c0 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
272d0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
272e0 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52  Ovfl);..  if( pR
272f0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
27300 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27310 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
27320 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
27330 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
27340 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
27350 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
27360 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
27370 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27380 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
27390 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
273a0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
273b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
273c0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
273d0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
273e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
273f0 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
27400 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
27410 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
27420 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
27430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
27450 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
27460 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
27470 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
27480 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
27490 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
274a0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
274b0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
274c0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
274d0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
274e0 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
274f0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
27500 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
27510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
27520 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
27530 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
27540 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
27550 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27560 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27570 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
27580 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27590 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
275a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
275b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
275c0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
275d0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
275e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
275f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
27600 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
27610 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
27620 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
27630 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
27640 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
27650 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
27660 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
27670 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
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 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
276b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
276c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
276d0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
276e0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
276f0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
27700 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
27710 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
27720 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
27730 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
27740 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
27750 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
27760 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
27770 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
27780 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
27790 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
277a0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
277b0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
277c0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
277d0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
277e0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
277f0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
27800 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
27810 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
27820 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
27830 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
27840 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
27850 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
27860 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
27870 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
27880 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
27890 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
278a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
278b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
278c0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
278d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
278e0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
278f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27900 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27910 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
27920 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
27930 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
27940 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
27950 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
27960 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
27970 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
27980 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
27990 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
279a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
279b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
279c0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
279d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
279e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
279f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27a00 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
27a10 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
27a20 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
27a30 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
27a40 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
27a50 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27a60 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
27a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27a80 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
27a90 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
27aa0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27ab0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
27ac0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
27ad0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
27ae0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
27af0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
27b00 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
27b10 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
27b20 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
27b30 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
27b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27b50 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
27b60 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
27b70 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
27b80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27b90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27ba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27bb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27bc0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
27bd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
27be0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
27bf0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
27c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27c10 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
27c20 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
27c30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27c40 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27c50 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
27c60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27c70 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
27c80 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
27c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27ca0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
27cb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27cc0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
27cd0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
27ce0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
27cf0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
27d00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
27d10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
27d20 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27d30 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
27d40 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
27d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
27d60 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
27d70 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
27d80 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
27d90 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
27da0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
27db0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
27dc0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
27dd0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
27de0 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
27df0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
27e00 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
27e10 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
27e20 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27e30 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27e40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27e50 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
27e60 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
27e70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
27e80 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
27e90 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
27ea0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
27eb0 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
27ec0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
27ed0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
27ee0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
27ef0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
27f00 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
27f10 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
27f20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
27f30 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
27f40 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
27f50 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
27f60 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
27f70 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
27f80 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
27f90 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
27fa0 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
27fb0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
27fc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27fd0 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
27fe0 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
27ff0 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
28000 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28010 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28020 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
28030 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
28040 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
28050 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
28060 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28070 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
28080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28090 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
280a0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
280b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
280c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
280d0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
280e0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
280f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28100 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
28110 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
28120 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28130 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
28140 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
28150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
28160 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28170 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28180 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
28190 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
281a0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
281b0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pCur);.      if(
281c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
281d0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
281e0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
281f0 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
28200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
28210 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28220 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
28230 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a      }.   .    }.
28240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28250 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
28260 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
28270 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
28280 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
28290 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
282a0 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
282b0 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
282c0 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
282d0 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
282e0 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
282f0 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
28300 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
28310 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
28320 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
28330 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
28340 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
28350 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
28360 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
28370 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
28380 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
28390 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
283a0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
283b0 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
283c0 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
283d0 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
283e0 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
283f0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
28400 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
28410 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
28420 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
28430 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
28440 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
28450 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
28460 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
28470 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
28480 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
28490 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
284a0 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
284b0 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
284c0 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
284d0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
284e0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
284f0 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
28500 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
28510 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
28520 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
28530 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
28540 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
28550 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
28560 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
28570 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
28580 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
28590 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
285a0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
285b0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
285c0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
285d0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
285e0 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
285f0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
28600 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
28610 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
28640 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
28650 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
28660 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
28670 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
28680 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
28690 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
286a0 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
286b0 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
286c0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
286d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
286e0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
286f0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
28700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28710 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
28720 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
28730 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
28740 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
28750 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
28760 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
28770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
28780 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
28790 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
287a0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
287b0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
287c0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
287d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287f0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
28800 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
28810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
28820 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
28830 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
28840 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28850 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28860 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28870 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
28880 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
28890 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
288a0 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
288b0 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
288c0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
288d0 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
288e0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
288f0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
28900 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
28910 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
28920 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
28930 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
28940 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
28950 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
28960 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28970 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
28980 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28990 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
289a0 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  )!=0.   && pCur-
289b0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
289c0 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
289d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
289e0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
289f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28a00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28a10 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
28a20 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
28a30 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
28a40 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e  )!=0 && pCur->in
28a50 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
28a60 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28a70 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
28a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28a90 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
28aa0 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
28ab0 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
28ac0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
28ad0 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
28ae0 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
28af0 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
28b00 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
28b10 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
28b20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
28b30 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
28b40 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
28b50 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
28b60 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
28b70 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
28b80 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
28b90 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
28ba0 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
28bb0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
28bc0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
28bd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
28be0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
28bf0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
28c00 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
28c10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
28c20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28c30 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
28c40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28c50 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
28c60 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
28c70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28c80 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
28c90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28ca0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
28cb0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
28cc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28cd0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
28ce0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
28cf0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
28d00 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
28d10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28d20 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
28d30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28d40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
28d50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
28d60 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
28d70 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
28d80 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
28d90 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
28da0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
28db0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
28dc0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28dd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28de0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
28df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
28e10 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
28e20 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
28e30 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
28e40 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
28e50 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
28e60 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
28e70 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
28e80 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
28e90 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
28ea0 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
28eb0 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
28ec0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
28ed0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
28ee0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
28ef0 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
28f00 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
28f10 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
28f20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
28f30 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
28f40 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
28f50 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
28f60 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
28f70 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
28f80 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
28f90 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
28fa0 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
28fb0 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
28fc0 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
28fd0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
28fe0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
28ff0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
29000 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
29010 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
29020 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
29030 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
29040 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
29050 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
29060 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
29070 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
29080 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
29090 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
290a0 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
290b0 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
290c0 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
290d0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
290e0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
290f0 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
29100 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
29110 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
29120 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
29130 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
29140 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
29150 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
29160 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
29170 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
29180 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
29190 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
291a0 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
291b0 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
291c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
291d0 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
291e0 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51  aEnd ) return SQ
291f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29200 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
29210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29220 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
29230 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
29240 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
29250 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
29260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
29270 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
29280 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
29290 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
292a0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
292b0 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
292c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
292d0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
292e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
292f0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
29300 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
29310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29320 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
29330 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
29340 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
29350 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
29360 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
29370 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
29380 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
29390 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
293a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
293b0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
293c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
293d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
293e0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
293f0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
29400 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
29410 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
29420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29430 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
29440 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29450 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
29460 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
29470 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
29480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29490 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
294a0 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
294b0 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
294c0 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
294d0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
294e0 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
294f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29500 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
29510 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
29520 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
29530 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
29540 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
29550 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20  trSize;..       
29560 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
29570 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
29580 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
29590 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
295a0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
295b0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
295c0 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
295d0 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
295e0 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
295f0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
29600 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
29610 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
29620 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
29630 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
29640 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
29650 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
29660 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
29670 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
29680 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
29690 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
296a0 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
296b0 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
296c0 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
296d0 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
296e0 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
296f0 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
29700 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
29710 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
29720 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
29730 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29740 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
29750 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
29760 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
29770 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
29780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
29790 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
297a0 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
297b0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
297c0 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
297d0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
297e0 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
297f0 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
29800 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
29810 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
29820 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
29830 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
29840 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
29850 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
29860 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
29870 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
29880 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
29890 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
298a0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
298b0 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
298c0 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
298d0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
298e0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
298f0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
29900 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
29910 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
29920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
29930 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
29940 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
29950 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
29960 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
29970 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
29980 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
29990 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
299a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
299b0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
299c0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
299d0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
299e0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
299f0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
29a00 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
29a10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
29a20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
29a30 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
29a40 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
29a50 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
29a60 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
29a70 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
29a80 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
29a90 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
29aa0 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
29ab0 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
29ac0 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
29ad0 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
29ae0 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
29af0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
29b00 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
29b10 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
29b20 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
29b30 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
29b40 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
29b50 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
29b60 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
29b70 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
29b80 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
29b90 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
29ba0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
29bb0 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
29bc0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
29bd0 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
29be0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
29bf0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
29c00 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
29c10 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
29c20 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
29c30 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
29c40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29c50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
29c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29c70 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
29c80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29c90 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
29ca0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29cb0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
29cc0 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
29cd0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
29ce0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
29cf0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
29d00 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
29d10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
29d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
29d30 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
29d40 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
29d50 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
29d60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29d70 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
29d80 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
29d90 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
29da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
29db0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
29dc0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
29dd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
29de0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
29df0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
29e00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
29e10 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
29e20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
29e30 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
29e40 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
29e50 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
29e60 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
29e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
29e80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
29e90 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
29ea0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
29eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
29ec0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
29ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29ee0 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
29ef0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
29f00 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
29f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29f20 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
29f30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29f40 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
29f50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29f60 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
29f70 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
29f80 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
29f90 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
29fa0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
29fb0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
29fc0 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
29fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
29fe0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
29ff0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2a000 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2a010 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2a020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a030 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2a040 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2a050 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2a060 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2a070 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2a080 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2a090 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2a0a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a0b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a0c0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2a0d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a0e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2a0f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a100 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2a110 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2a120 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2a130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2a140 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2a150 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2a160 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2a170 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2a180 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2a190 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2a1a0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2a1b0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2a1c0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2a1d0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2a1e0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2a1f0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2a200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2a210 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a220 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
2a230 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2a240 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2a250 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2a260 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2a270 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2a280 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2a290 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2a2a0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2a2b0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2a2c0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75  lidOvfl);.  retu
2a2d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2a2e0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2a2f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2a300 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a310 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2a320 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2a330 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2a340 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2a350 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2a360 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2a370 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2a380 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2a390 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2a3a0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2a3b0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2a3c0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2a3d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2a3e0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2a3f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a400 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2a410 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2a420 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2a430 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2a440 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a450 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2a460 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2a470 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2a480 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2a490 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2a4a0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2a4b0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2a4c0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2a4d0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2a4e0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2a4f0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2a500 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2a510 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2a520 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2a530 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2a540 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2a550 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2a560 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2a570 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2a580 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2a590 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2a5a0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2a5b0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2a5c0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2a5d0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2a5e0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2a5f0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2a600 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2a610 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2a620 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2a630 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2a640 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2a650 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2a660 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2a670 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2a680 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2a690 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2a6a0 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2a6b0 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2a6c0 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2a6d0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2a6e0 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2a6f0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2a700 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2a710 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2a720 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2a730 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2a740 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2a750 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2a760 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2a770 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2a780 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2a790 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2a7a0 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2a7b0 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2a7c0 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2a7d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2a7e0 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2a7f0 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2a800 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2a810 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2a820 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2a830 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2a840 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2a850 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2a860 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2a870 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2a880 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2a890 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2a8a0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2a8b0 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2a8c0 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2a8d0 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2a8e0 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2a8f0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2a900 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2a910 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2a920 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2a930 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2a940 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2a950 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2a960 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2a970 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2a980 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2a990 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2a9a0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2a9b0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2a9c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2a9d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2a9e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2a9f0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2aa00 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2aa10 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2aa20 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2aa30 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2aa40 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2aa50 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2aa60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
2aa70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2aa80 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2aa90 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  =0 );.    rc = r
2aaa0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2aab0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2aac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2aad0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2aae0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2aaf0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2ab00 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2ab10 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2ab20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2ab30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2ab40 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2ab50 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2ab60 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2ab70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ab80 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2ab90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2aba0 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2abb0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2abc0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2abd0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2abe0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pNext>0 ){.     
2abf0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2ac00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2ac10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ac20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2ac30 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2ac40 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2ac50 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2ac60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ac70 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
2ac80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2ac90 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2aca0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2acb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
2acc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2acd0 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
2ace0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
2acf0 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
2ad00 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
2ad10 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
2ad20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
2ad30 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
2ad40 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
2ad50 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
2ad60 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
2ad70 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
2ad80 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
2ad90 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
2ada0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2adb0 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
2adc0 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
2add0 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
2ade0 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
2adf0 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
2ae00 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
2ae10 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
2ae20 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28  >nCell );..  if(
2ae30 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
2ae40 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
2ae50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2ae60 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2ae70 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2ae80 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2ae90 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2aea0 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
2aeb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2aec0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
2aed0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2aee0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2aef0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
2af00 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2af10 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2af20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
2af30 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2af40 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2af50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2af60 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2af70 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2af80 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2af90 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2afa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2afb0 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2afc0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2afd0 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
2afe0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
2aff0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2b000 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2b010 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2b020 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2b030 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2b040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b050 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
2b060 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2b070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b090 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2b0a0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2b0b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b0c0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2b0d0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2b0e0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2b0f0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
2b100 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2b110 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b120 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2b130 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2b140 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2b150 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2b160 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2b170 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2b180 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2b190 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2b1a0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2b1b0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2b1c0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2b1d0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65  lidOvfl);.  *pRe
2b1e0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  s = 0;.  if( pCu
2b1f0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2b200 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2b210 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2b220 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20   pRes);.  pPage 
2b230 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2b240 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2b250 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64  f( (++pCur->aiId
2b260 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e  x[pCur->iPage])>
2b270 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2b280 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2b290 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2b2a0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2b2b0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2b2c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2b2d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b2e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b2f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2b300 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2b310 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2b320 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2b330 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2b340 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2b350 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2b360 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2b370 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2b380 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2b390 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2b3a0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2b3b0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
2b3c0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2b3d0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2b3e0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2b3f0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2b400 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2b410 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2b420 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2b430 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2b440 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
2b450 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2b460 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2b470 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2b480 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
2b490 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2b4a0 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2b4b0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2b4c0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2b4d0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2b4e0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
2b4f0 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
2b500 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
2b510 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2b520 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2b530 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2b540 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
2b550 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2b560 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2b570 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2b580 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2b590 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2b5a0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2b5b0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2b5c0 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2b5d0 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2b5e0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2b5f0 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2b600 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2b610 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2b620 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2b630 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2b640 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2b650 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2b660 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2b670 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2b680 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2b690 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2b6a0 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2b6b0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2b6c0 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2b6d0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2b6e0 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2b6f0 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2b700 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2b710 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2b720 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2b730 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2b740 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2b750 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2b760 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2b770 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2b780 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2b790 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2b7a0 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50  NLINE int btreeP
2b7b0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2b7c0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2b7d0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2b7e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2b7f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b800 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2b810 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b820 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2b830 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2b840 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b850 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2b860 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2b870 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2b880 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2b890 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
2b8a0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2b8b0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2b8c0 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
2b8d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2b8e0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
2b8f0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2b900 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2b910 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2b920 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2b930 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2b940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b950 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2b960 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2b970 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2b980 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2b990 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2b9a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b9b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2b9c0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2b9d0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2b9e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b9f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2ba00 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2ba10 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2ba20 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2ba30 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2ba40 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2ba50 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2ba60 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
2ba70 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2ba80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ba90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2baa0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2bab0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2bac0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2bad0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2bae0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2baf0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2bb00 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
2bb10 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2bb20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
2bb30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2bb40 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
2bb50 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2bb60 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
2bb70 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
2bb80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2bb90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2bba0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2bbb0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2bbc0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
2bbd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2bbe0 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
2bbf0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2bc00 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2bc10 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2bc20 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2bc30 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2bc40 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
2bc50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bc60 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2bc70 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2bc80 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2bc90 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2bca0 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
2bcb0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2bcc0 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
2bcd0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2bce0 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
2bcf0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2bd00 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
2bd10 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2bd20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2bd30 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
2bd40 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2bd50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2bd60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bd70 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2bd80 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2bd90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2bda0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2bdb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2bdc0 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
2bdd0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
2bde0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2bdf0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73  nt *pRes){.  ass
2be00 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2be10 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2be20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2be30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2be40 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2be50 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2be60 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2be70 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2be80 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2be90 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2bea0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2beb0 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2bec0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2bed0 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2bee0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2bef0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2bf00 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2bf10 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2bf20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bf30 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
2bf40 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2bf50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2bf60 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
2bf70 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
2bf80 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2bf90 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2bfa0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2bfb0 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2bfc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2bfd0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2bfe0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2bff0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2c000 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2c010 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2c020 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2c030 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2c040 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2c050 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2c060 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2c070 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2c080 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2c090 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2c0a0 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2c0b0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2c0c0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2c0d0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2c0e0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2c0f0 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2c100 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2c110 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c120 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2c130 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2c140 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2c150 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2c160 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
2c170 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
2c180 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
2c190 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2c1a0 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
2c1b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2c1c0 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
2c1d0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
2c1e0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
2c1f0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
2c200 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
2c210 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
2c220 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
2c230 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
2c240 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
2c250 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
2c260 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2c270 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
2c280 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
2c290 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
2c2a0 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
2c2b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c2c0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
2c2d0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
2c2e0 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
2c2f0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
2c300 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
2c310 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
2c320 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
2c330 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
2c340 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
2c350 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2c360 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2c370 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
2c380 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
2c390 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
2c3a0 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
2c3b0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
2c3c0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
2c3d0 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
2c3e0 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
2c3f0 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
2c400 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
2c410 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
2c420 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
2c430 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
2c440 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2c450 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
2c460 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
2c470 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2c480 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
2c490 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2c4a0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
2c4b0 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
2c4c0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2c4d0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
2c4e0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
2c4f0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
2c500 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
2c510 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
2c520 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
2c530 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
2c540 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
2c550 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
2c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c570 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
2c580 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
2c590 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
2c5a0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2c5b0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
2c5c0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
2c5d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2c5e0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
2c5f0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
2c600 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
2c610 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
2c620 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2c630 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
2c640 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
2c650 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
2c660 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
2c670 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
2c680 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2c690 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2c6a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c6b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2c6c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2c6d0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
2c6e0 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
2c6f0 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
2c700 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
2c710 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
2c720 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2c730 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
2c740 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
2c750 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
2c760 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
2c770 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2c780 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2c790 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
2c7a0 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
2c7b0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2c7c0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2c7d0 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
2c7e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2c7f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2c800 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2c810 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2c820 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2c830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c840 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2c850 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2c860 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2c870 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2c880 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2c890 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2c8a0 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2c8b0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
2c8c0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
2c8d0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2c8e0 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
2c8f0 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
2c900 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
2c910 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
2c920 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
2c930 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
2c940 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
2c950 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
2c960 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
2c970 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
2c980 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
2c990 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
2c9a0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
2c9b0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
2c9c0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
2c9d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c9e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2c9f0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2ca00 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
2ca10 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
2ca20 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
2ca30 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
2ca40 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
2ca50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2ca60 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2ca70 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
2ca80 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2ca90 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
2caa0 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
2cab0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2cac0 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
2cad0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2cae0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2caf0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2cb00 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2cb10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2cb20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2cb30 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
2cb40 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2cb50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2cb60 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
2cb70 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
2cb80 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
2cb90 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
2cba0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
2cbb0 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
2cbc0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
2cbd0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
2cbe0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
2cbf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2cc00 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2cc10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2cc20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2cc30 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2cc40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2cc50 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
2cc60 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
2cc70 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
2cc80 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
2cc90 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
2cca0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
2ccb0 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
2ccc0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
2ccd0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
2cce0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
2ccf0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
2cd00 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
2cd10 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2cd20 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2cd30 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
2cd40 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
2cd50 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
2cd60 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2cd70 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2cd80 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
2cd90 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
2cda0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
2cdb0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
2cdc0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
2cdd0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2cde0 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
2cdf0 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
2ce00 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
2ce10 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
2ce20 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
2ce30 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
2ce40 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2ce50 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
2ce60 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
2ce70 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
2ce80 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
2ce90 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
2cea0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2ceb0 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
2cec0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
2ced0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cee0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2cef0 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
2cf00 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
2cf10 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2cf20 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
2cf30 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2cf40 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
2cf50 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
2cf60 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
2cf70 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
2cf80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
2cf90 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
2cfa0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
2cfb0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2cfc0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2cfd0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2cfe0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
2cff0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2d000 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
2d010 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2d020 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2d040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d050 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2d060 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2d070 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2d080 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2d090 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2d0a0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2d0b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2d0c0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2d0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2d0e0 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2d0f0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2d100 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2d110 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2d120 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2d130 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2d140 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2d150 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2d160 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2d170 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2d180 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2d190 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2d1a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2d1b0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2d1c0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2d1d0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2d1e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2d1f0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2d200 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2d210 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2d220 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2d230 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2d240 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2d250 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2d260 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2d270 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2d280 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2d290 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2d2a0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2d2b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d2c0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2d2d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2d2e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2d2f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d300 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2d310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d320 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2d330 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2d340 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2d350 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2d360 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d370 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2d380 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2d390 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2d3a0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2d3b0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2d3c0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2d3d0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2d3e0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2d3f0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2d400 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2d410 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2d420 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2d430 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2d440 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2d450 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2d460 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2d470 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2d480 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d490 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2d4a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d4b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2d4c0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2d4d0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2d4e0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2d4f0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2d500 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2d510 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2d520 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2d530 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2d540 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2d550 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2d560 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2d570 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2d580 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2d590 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2d5a0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2d5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2d5c0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2d5d0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2d5e0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2d5f0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2d600 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d610 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2d620 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2d630 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2d640 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2d650 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d660 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2d670 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2d680 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d690 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2d6a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2d6b0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2d6c0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2d6d0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d6e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d6f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d700 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d710 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2d720 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2d730 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d750 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2d760 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2d770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d780 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2d790 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2d7a0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2d7b0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d7c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d7d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d7e0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2d7f0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2d800 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2d810 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2d820 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2d830 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2d840 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2d850 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2d860 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2d870 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2d880 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2d890 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2d8a0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2d8b0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2d8c0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2d8d0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2d8e0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2d8f0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2d900 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2d910 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2d920 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2d930 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2d940 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d950 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2d960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2d970 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2d980 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2d990 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2d9a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2d9b0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2d9c0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2d9d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d9e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d9f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2da00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2da10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2da30 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2da40 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2da50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2da60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2da70 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2da80 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2da90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2daa0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2dab0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2dac0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2dad0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2dae0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2daf0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2db00 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2db10 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2db20 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2db30 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2db40 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2db50 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2db60 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2db70 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2db80 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2db90 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2dba0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2dbb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2dbc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2dbd0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2dbe0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2dbf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2dc00 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2dc10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2dc20 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2dc30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dc40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2dc50 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2dc60 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2dc70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2dc80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2dc90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2dca0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2dcb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dcc0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2dcd0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2dce0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2dcf0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2dd00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dd10 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2dd20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2dd30 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2dd40 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2dd50 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2dd60 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2dd70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2dd80 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2dd90 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2dda0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2ddb0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2ddc0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2ddd0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2dde0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2ddf0 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2de00 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2de10 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2de20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2de30 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2de40 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2de50 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2de60 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2de70 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2de80 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2de90 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2dea0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2deb0 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2dec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2ded0 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2def0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2df00 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2df10 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2df20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2df30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2df40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2df50 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2df60 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2df70 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2df80 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2df90 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2dfa0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2dfb0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2dfc0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2dfd0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2dfe0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2dff0 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2e000 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2e010 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2e020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e030 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2e050 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2e060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e080 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2e090 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2e0a0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2e0b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2e0c0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2e0d0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2e0e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2e0f0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2e100 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2e110 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2e120 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2e130 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e140 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2e150 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2e160 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2e170 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2e180 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2e190 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2e1a0 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2e1b0 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2e1c0 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2e1d0 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2e1e0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2e1f0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2e200 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2e210 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2e220 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2e230 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2e240 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2e250 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2e260 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e280 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2e290 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2e2a0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2e2b0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2e2c0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2e2d0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2e2e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e2f0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2e300 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2e310 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2e320 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2e330 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2e340 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
2e350 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2e360 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
2e370 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
2e380 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
2e390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e3a0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
2e3b0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2e3c0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
2e3d0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
2e3e0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
2e3f0 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
2e400 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
2e410 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2e420 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2e430 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
2e440 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
2e450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e480 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2e490 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e4b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2e4d0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2e4e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2e4f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2e500 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2e510 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2e520 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e530 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2e540 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
2e550 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2e560 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
2e570 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
2e580 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
2e590 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
2e5a0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
2e5b0 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
2e5c0 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
2e5d0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
2e5e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2e5f0 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
2e600 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
2e610 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
2e620 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
2e630 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2e640 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
2e650 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
2e660 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
2e670 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
2e680 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
2e690 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
2e6a0 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
2e6b0 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
2e6c0 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
2e6d0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2e6e0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
2e6f0 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
2e700 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2e710 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
2e720 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
2e730 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
2e740 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
2e750 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
2e760 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
2e770 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
2e780 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
2e790 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
2e7a0 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
2e7b0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
2e7c0 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
2e7d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
2e7e0 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
2e7f0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2e800 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
2e810 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
2e820 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
2e830 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2e840 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
2e850 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
2e860 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
2e870 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
2e880 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
2e890 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
2e8a0 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
2e8b0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2e8c0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
2e8d0 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
2e8e0 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
2e8f0 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
2e900 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
2e910 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
2e920 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
2e930 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
2e940 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
2e950 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
2e960 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
2e970 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
2e980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e990 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
2e9a0 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
2e9b0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2e9c0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
2e9d0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
2e9e0 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
2e9f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ea00 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2ea10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2ea20 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ea30 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
2ea40 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
2ea50 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2ea60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2ea70 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
2ea80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ea90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2eaa0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2eab0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
2eac0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
2ead0 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
2eae0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
2eaf0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
2eb00 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
2eb10 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
2eb20 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
2eb30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2eb40 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
2eb50 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
2eb60 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
2eb70 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
2eb80 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
2eb90 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
2eba0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2ebb0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
2ebc0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2ebd0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
2ebe0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2ebf0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2ec00 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
2ec10 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
2ec20 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
2ec30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
2ec40 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
2ec50 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2ec60 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2ec70 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
2ec80 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
2ec90 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2eca0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ecb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2ecc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ecd0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
2ece0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2ecf0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
2ed00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2ed10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ed20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
2ed30 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
2ed40 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2ed50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ed60 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
2ed70 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2ed80 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
2ed90 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
2eda0 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
2edb0 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
2edc0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
2edd0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
2ede0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2edf0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2ee00 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2ee10 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2ee20 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
2ee30 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
2ee40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ee50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ee60 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2ee70 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2ee80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ee90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2eea0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2eeb0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
2eec0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2eed0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2eee0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
2eef0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2ef00 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2ef10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2ef20 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
2ef30 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
2ef40 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2ef50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2ef60 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
2ef70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ef80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ef90 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2efa0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
2efb0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
2efc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2efd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
2efe0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
2eff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2f000 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f010 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
2f020 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2f030 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
2f040 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2f050 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2f060 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
2f070 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
2f080 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2f090 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
2f0a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f0b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2f0c0 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
2f0d0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
2f0e0 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
2f0f0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
2f100 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
2f110 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
2f120 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
2f130 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
2f140 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
2f150 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2f160 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2f170 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
2f180 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
2f190 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
2f1a0 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
2f1b0 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
2f1c0 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
2f1d0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
2f1e0 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
2f1f0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
2f200 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
2f210 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
2f220 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
2f230 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
2f240 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
2f250 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
2f260 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2f270 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
2f280 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
2f290 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
2f2a0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2f2b0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2f2c0 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
2f2d0 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
2f2e0 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
2f2f0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
2f300 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2f310 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f320 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
2f330 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
2f340 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
2f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f360 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2f370 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
2f380 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
2f390 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
2f3a0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
2f3b0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
2f3c0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2f3d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2f3e0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2f400 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
2f410 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
2f420 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2f450 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
2f460 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f480 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2f490 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
2f4a0 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
2f4b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2f4c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2f4d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
2f4e0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
2f4f0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2f500 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2f510 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2f520 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
2f530 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
2f540 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f550 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
2f560 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2f570 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
2f580 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2f590 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2f5a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2f5b0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2f5c0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
2f5d0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
2f5e0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2f5f0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
2f600 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
2f610 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f620 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2f630 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
2f640 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2f650 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
2f660 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2f670 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
2f680 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2f690 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
2f6a0 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
2f6b0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
2f6c0 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
2f6d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
2f6e0 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
2f6f0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2f700 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
2f710 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
2f720 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
2f730 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
2f740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2f750 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
2f760 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2f770 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
2f780 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
2f790 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
2f7a0 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
2f7b0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2f7c0 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
2f7d0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
2f7e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2f7f0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
2f800 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
2f810 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
2f820 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2f830 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2f840 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2f850 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
2f860 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
2f870 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
2f880 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2f890 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
2f8a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
2f8b0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2f8c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
2f8d0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2f8e0 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
2f8f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2f900 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2f910 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
2f920 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
2f930 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
2f940 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
2f950 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
2f960 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
2f970 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
2f980 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
2f990 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
2f9a0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
2f9b0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2f9c0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
2f9d0 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
2f9e0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
2f9f0 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
2fa00 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
2fa10 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
2fa20 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
2fa30 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
2fa40 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2fa50 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
2fa60 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
2fa70 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
2fa80 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
2fa90 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
2faa0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
2fab0 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
2fac0 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
2fad0 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2faf0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2fb00 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
2fb10 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
2fb20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2fb30 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2fb40 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
2fb50 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2fb60 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2fb70 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
2fb80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fb90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2fba0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2fbb0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
2fbc0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2fbd0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2fbe0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2fbf0 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
2fc00 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
2fc10 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
2fc20 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
2fc30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2fc40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2fc50 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2fc60 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
2fc70 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
2fc80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2fc90 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
2fca0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
2fcb0 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
2fcc0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
2fcd0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
2fce0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
2fcf0 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
2fd00 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
2fd10 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
2fd20 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2fd30 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
2fd40 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
2fd50 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
2fd60 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2fd70 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
2fd80 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
2fd90 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
2fda0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
2fdb0 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
2fdc0 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
2fdd0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2fde0 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
2fdf0 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
2fe00 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
2fe10 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
2fe20 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
2fe30 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2fe40 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2fe50 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
2fe60 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
2fe70 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
2fe80 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
2fe90 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
2fea0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
2feb0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2fec0 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
2fed0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
2fee0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
2fef0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2ff00 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
2ff10 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
2ff20 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
2ff30 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2ff40 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
2ff50 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
2ff60 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
2ff70 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
2ff80 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
2ff90 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
2ffa0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
2ffb0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
2ffc0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
2ffd0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
2ffe0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
2fff0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
30000 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
30010 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72  20-11576 However
30020 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  , newer versions
30030 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c   of SQLite still
30040 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20  .      ** avoid 
30050 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73  using the last s
30060 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ix entries in th
30070 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
30080 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20   page array in. 
30090 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68       ** order th
300a0 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
300b0 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77  s created by new
300c0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
300d0 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20  QLite can be.   
300e0 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c     ** read by ol
300f0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
30100 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f  SQLite..      */
30110 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
30120 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
30130 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30140 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30160 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
30170 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
30180 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
30190 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
301a0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
301b0 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
301c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
301d0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
301e0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
301f0 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
30200 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
30210 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
30220 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
30230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
30240 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
30250 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
30260 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
30270 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
30280 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
30290 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
302a0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
302b0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
302c0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
302d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
302e0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
302f0 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
30300 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
30310 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
30320 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
30330 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
30340 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
30350 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
30360 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
30370 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
30380 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
30390 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
303a0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
303b0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
303c0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
303d0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
303e0 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
303f0 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
30400 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
30410 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
30420 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
30430 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
30440 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
30450 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
30460 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
30470 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
30480 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
30490 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
304a0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
304b0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
304c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
304d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
304e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
304f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
30500 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
30510 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
30520 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
30530 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
30540 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
30550 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
30560 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
30570 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
30580 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
30590 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
305a0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
305b0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
305c0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
305d0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
305e0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
305f0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
30600 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30610 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
30620 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
30630 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
30640 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
30650 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
30660 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
30670 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
30680 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
30690 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
306a0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
306b0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
306c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
306d0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
306e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
306f0 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
30700 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
30710 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20  local Cell size 
30720 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  (the number of b
30730 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67  ytes on the orig
30740 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74  inal page, omitt
30750 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29  ing.** overflow)
30760 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a   into *pnSize..*
30770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
30780 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  arCell(.  MemPag
30790 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
307a0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
307b0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
307c0 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   Cell */.  unsig
307d0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
307e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
307f0 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f  e of the Cell */
30800 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20  .  u16 *pnSize  
30810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
30820 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  rite the size of
30830 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a   the Cell here *
30840 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
30850 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
30860 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
30870 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
30880 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
30890 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
308a0 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
308b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
308c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
308d0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
308e0 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
308f0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
30900 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
30910 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
30920 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f  Size;.  if( info
30930 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b  .iOverflow==0 ){
30940 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30950 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76  TE_OK;  /* No ov
30960 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65  erflow pages. Re
30970 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
30980 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
30990 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69   }.  if( pCell+i
309a0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20  nfo.iOverflow+3 
309b0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
309c0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29  Page->maskPage )
309d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
309e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
309f0 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e  ;  /* Cell exten
30a00 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
30a10 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  age */.  }.  ovf
30a20 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
30a30 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
30a40 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
30a50 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
30a60 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
30a70 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
30a80 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
30a90 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
30aa0 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
30ab0 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
30ac0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
30ad0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
30ae0 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a  rt( nOvfl>0 || .
30af0 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20      (CORRUPT_DB 
30b00 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  && (info.nPayloa
30b10 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
30b20 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
30b30 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
30b40 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
30b50 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
30b60 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
30b70 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
30b80 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
30b90 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
30ba0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
30bb0 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
30bc0 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
30bd0 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
30be0 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
30bf0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
30c00 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
30c10 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
30c20 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30c30 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
30c40 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
30c50 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
30c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
30c80 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
30c90 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
30ca0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
30cb0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
30cc0 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
30cd0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
30ce0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30cf0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
30d00 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
30d10 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
30d20 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
30d30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
30d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
30d50 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
30d60 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
30d70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
30d80 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
30d90 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
30da0 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
30db0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
30dc0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
30dd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
30de0 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
30df0 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
30e00 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
30e10 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
30e20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
30e30 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
30e40 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
30e50 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
30e60 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
30e70 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
30e80 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
30e90 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
30ea0 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
30eb0 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
30ec0 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
30ed0 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
30ee0 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
30ef0 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
30f00 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
30f10 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
30f20 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
30f30 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
30f40 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
30f50 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
30f60 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
30f70 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
30f80 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
30f90 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
30fa0 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
30fb0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
30fc0 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
30fd0 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
30fe0 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
30ff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31000 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31020 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
31030 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
31040 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
31050 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
31060 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
31070 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
31080 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
31090 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
310a0 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
310b0 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
310c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
310d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
310e0 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
310f0 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
31100 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
31110 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
31120 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
31130 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
31140 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
31150 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
31160 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
31170 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
31180 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
31190 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
311a0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
311b0 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
311c0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
311d0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
311e0 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
311f0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
31200 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
31210 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
31220 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
31230 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
31240 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
31250 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
31260 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
31270 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
31280 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
31290 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
312a0 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
312b0 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
312c0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
312d0 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
312e0 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
312f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31310 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
31320 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
31330 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
31340 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
31350 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
31360 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
31370 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
31380 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
31390 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
313a0 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
313b0 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
313c0 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
313d0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
313e0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
313f0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
31400 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
31410 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
31420 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31440 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
31450 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
31460 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
31470 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
31480 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
31490 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
314a0 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
314b0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
314c0 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
314d0 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
314e0 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
314f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
31500 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
31510 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
31520 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
31530 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
31540 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20   int nHeader;.. 
31550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31560 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
31570 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
31580 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
31590 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
315a0 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
315b0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
315c0 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
315d0 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
315e0 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
315f0 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
31600 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
31610 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
31620 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
31630 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
31640 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
31650 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
31660 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31670 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
31680 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
31690 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
316a0 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
316b0 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
316c0 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61  rSize;.  nPayloa
316d0 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
316e0 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
316f0 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
31700 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
31710 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
31720 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
31730 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ad);.  }else{.  
31740 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d    assert( nData=
31750 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
31760 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20  ( nZero==0 );.  
31770 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
31780 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
31790 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
317a0 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a  )&nKey);.  .  /*
317b0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
317c0 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69  load size */.  i
317d0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
317e0 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
317f0 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
31800 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
31810 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
31820 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e  .    if( NEVER(n
31830 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c  Key>0x7fffffff |
31840 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20  | pKey==0) ){.  
31850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31860 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
31870 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
31880 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  ad = (int)nKey;.
31890 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
318a0 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
318b0 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  )nKey;.  }.  if(
318c0 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
318d0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
318e0 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20    n = nHeader + 
318f0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65  nPayload;.    te
31900 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a  stcase( n==3 );.
31910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
31920 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  =4 );.    if( n<
31930 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a  4 ) n = 4;.    *
31940 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  pnSize = n;.    
31950 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79  spaceLeft = nPay
31960 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72  load;.    pPrior
31970 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73   = pCell;.  }els
31980 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20  e{.    int mn = 
31990 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
319a0 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e  .    n = mn + (n
319b0 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20  Payload - mn) % 
319c0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
319d0 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
319e0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
319f0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
31a00 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
31a10 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
31a20 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
31a30 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  n > pPage->maxLo
31a40 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20  cal ) n = mn;.  
31a50 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b    spaceLeft = n;
31a60 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
31a70 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a   + nHeader + 4;.
31a80 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43      pPrior = &pC
31a90 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a  ell[nHeader+n];.
31aa0 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d    }.  pPayload =
31ab0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
31ac0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
31ad0 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20  point variables 
31ae0 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73  should be set as
31af0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
31b00 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20   **   nPayload  
31b10 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70           Total p
31b20 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62  ayload size in b
31b30 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79  ytes.  **   pPay
31b40 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42  load           B
31b50 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79  egin writing pay
31b60 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20  load here.  **  
31b70 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20   spaceLeft      
31b80 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61      Space availa
31b90 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e  ble at pPayload.
31ba0 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70    If nPayload>sp
31bb0 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20  aceLeft,.  **   
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bd0 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f     that means co
31be0 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c  ntent must spill
31bf0 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
31c00 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e  ages..  **   *pn
31c10 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
31c20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61  Size of the loca
31c30 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e  l cell (not coun
31c40 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61  ting overflow pa
31c50 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69  ges).  **   pPri
31c60 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57  or             W
31c70 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
31c80 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69  e pgno of the fi
31c90 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
31ca0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20  e.  **.  ** Use 
31cb0 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50  a call to btreeP
31cc0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f  arseCellPtr() to
31cd0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
31ce0 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20   values above.  
31cf0 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  ** were computed
31d00 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
31d10 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
31d20 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  G.  {.    CellIn
31d30 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72  fo info;.    btr
31d40 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
31d50 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
31d60 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
31d70 20 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69   nHeader=(int)(i
31d80 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
31d90 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73  Cell) );.    ass
31da0 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
31db0 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
31dc0 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
31dd0 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
31de0 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
31df0 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
31e00 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
31e10 20 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c   pPrior == &pCel
31e20 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
31e30 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ] );.  }.#endif.
31e40 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
31e50 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
31e60 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
31e70 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
31e80 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
31e90 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
31ea0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
31eb0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
31ec0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31ed0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31ee0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
31ef0 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
31f00 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
31f10 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
31f20 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
31f30 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31f40 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
31f50 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
31f60 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
31f70 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
31f80 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
31f90 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
31fa0 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
31fb0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
31fc0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
31fd0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
31fe0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
31ff0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
32000 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
32010 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
32020 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
32030 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32040 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
32050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
32060 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
32070 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
32080 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
32090 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
320a0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
320b0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
320c0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
320d0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
320e0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
320f0 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
32100 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
32110 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
32120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
32130 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
32140 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
32150 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
32160 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
32170 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
32180 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
32190 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
321a0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
321b0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
321c0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
321d0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
321e0 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
321f0 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
32200 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
32210 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
32220 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
32230 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
32240 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
32250 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
32260 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
32270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32280 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
32290 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
322a0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
322b0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
322c0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
322d0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
322e0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
322f0 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
32300 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
32310 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32320 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
32330 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
32340 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
32350 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
32360 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
32370 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
32380 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
32390 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
323a0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
323b0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
323c0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
323d0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
323e0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
323f0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
32400 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
32410 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
32420 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
32430 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
32440 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
32450 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
32460 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
32470 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
32480 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
32490 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
324a0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
324b0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
324c0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
324d0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
324e0 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
324f0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
32500 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
32510 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
32520 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
32530 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32540 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
32550 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
32560 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
32570 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
32580 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32590 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
325a0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
325b0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
325c0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
325d0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
325e0 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
325f0 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
32600 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
32610 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
32620 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
32630 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
32640 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
32650 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
32660 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
32670 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
32680 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
32690 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
326a0 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
326b0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
326c0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
326d0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
326e0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
326f0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
32700 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
32710 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
32720 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32730 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
32740 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
32750 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
32760 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
32770 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
32780 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
32790 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
327a0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
327b0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
327c0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
327d0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
327e0 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
327f0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
32800 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
32810 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
32820 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32830 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
32840 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
32850 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
32860 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
32870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
32880 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
32890 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
328a0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
328b0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
328c0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
328d0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
328e0 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
328f0 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
32900 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
32910 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
32920 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
32930 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
32940 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
32950 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
32960 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
32970 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
32980 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
32990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
329a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
329b0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
329c0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
329d0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
329e0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
329f0 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
32a00 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
32a10 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
32a20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
32a30 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
32a40 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
32a50 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
32a60 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
32a70 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
32a80 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
32a90 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
32aa0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
32ab0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
32ac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
32ad0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
32ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
32af0 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
32b00 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
32b10 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
32b20 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
32b30 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
32b40 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
32b50 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
32b60 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
32b70 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
32b80 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
32b90 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
32ba0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
32bb0 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
32bc0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
32bd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
32be0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
32bf0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
32c00 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
32c10 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
32c20 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
32c30 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
32c40 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
32c50 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
32c60 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
32c70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
32c80 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
32c90 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c  T_DB || sz==cell
32ca0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
32cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
32cc0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
32cd0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
32ce0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
32cf0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32d00 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
32d10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
32d20 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
32d30 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67  a;.  ptr = &pPag
32d40 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64  e->aCellIdx[2*id
32d50 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
32d60 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
32d70 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
32d80 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
32d90 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
32da0 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
32db0 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
32dc0 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
32dd0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
32de0 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62   pc < (u32)get2b
32df0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
32e00 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
32e10 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
32e20 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
32e30 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32e40 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
32e50 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
32e60 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
32e70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
32e80 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
32e90 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
32ea0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
32eb0 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  l--;.  if( pPage
32ec0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
32ed0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
32ee0 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
32ef0 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
32f00 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  0;.    put2byte(
32f10 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50  &data[hdr+5], pP
32f20 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
32f30 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
32f40 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
32f50 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
32f60 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   - pPage->hdrOff
32f70 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  set.            
32f80 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61             - pPa
32f90 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
32fa0 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 8;.  }else{. 
32fb0 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20     memmove(ptr, 
32fc0 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d  ptr+2, 2*(pPage-
32fd0 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a  >nCell - idx));.
32fe0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
32ff0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
33000 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  ->nCell);.    pP
33010 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
33020 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
33030 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
33040 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
33050 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
33060 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
33070 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
33080 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
33090 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
330a0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
330b0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
330c0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
330d0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
330e0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
330f0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
33100 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
33110 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
33120 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
33130 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
33140 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
33150 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
33160 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
33170 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
33180 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
33190 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
331a0 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
331b0 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
331c0 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
331d0 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
331e0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
331f0 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
33200 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
33210 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
33220 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
33230 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  emented..*/.stat
33240 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65  ic void insertCe
33250 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
33260 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
33270 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
33280 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
33290 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
332a0 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
332b0 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
332c0 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
332d0 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
332e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
332f0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
33300 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
33310 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
33320 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
33330 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
33340 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
33350 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
33360 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
33370 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
33380 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a   iChild,      /*
33390 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
333a0 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
333b0 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
333c0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  lue */.  int *pR
333d0 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  C          /* Re
333e0 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74  ad and write ret
333f0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65  urn code from he
33400 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
33410 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  dx = 0;      /* 
33420 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
33430 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
33440 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
33450 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
33460 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
33470 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
33480 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
33490 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
334a0 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
334b0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
334c0 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
334d0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
334e0 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
334f0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
33500 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
33510 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
33520 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
33530 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
33540 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
33550 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
33560 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
33570 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
33580 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  e */..  if( *pRC
33590 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
335a0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
335b0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
335c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
335d0 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43  ;.  assert( MX_C
335e0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
335f0 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
33600 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
33610 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
33620 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54  >pBt) || CORRUPT
33630 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
33640 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
33650 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
33660 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
33670 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
33680 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
33690 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
336a0 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
336b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
336c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
336d0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
336e0 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
336f0 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
33700 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
33710 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
33720 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
33730 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
33740 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
33750 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
33760 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
33770 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
33780 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
33790 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
337a0 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
337b0 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
337c0 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
337d0 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
337e0 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
337f0 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
33800 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
33810 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
33820 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
33830 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
33840 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
33850 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
33860 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
33870 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
33880 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
33890 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
338a0 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
338b0 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
338c0 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
338d0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
338e0 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
338f0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
33900 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
33910 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
33920 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
33930 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
33940 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
33950 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
33960 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
33970 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
33980 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
33990 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
339a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
339b0 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
339c0 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
339d0 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  [j] = (u16)i;.  
339e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
339f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33a00 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
33a10 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33a20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33a30 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
33a40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
33a50 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
33a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33a70 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
33a80 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
33a90 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
33aa0 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
33ab0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
33ac0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
33ad0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
33ae0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
33af0 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
33b00 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
33b10 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
33b20 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
33b30 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
33b40 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
33b50 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
33b60 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
33b70 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
33b80 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
33b90 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69  ing two properti
33ba0 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
33bb0 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20  returns success 
33bc0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
33bd0 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20  dx >= end+2 );. 
33be0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
33bf0 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
33c00 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
33c10 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
33c20 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
33c30 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
33c40 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
33c50 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d  emcpy(&data[idx]
33c60 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
33c70 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
33c80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
33c90 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
33ca0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  d);.    }.    me
33cb0 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b  mmove(&data[ins+
33cc0 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20  2], &data[ins], 
33cd0 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75  end-ins);.    pu
33ce0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
33cf0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
33d00 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
33d10 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
33d20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
33d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33d40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33d50 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
33d60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
33d70 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
33d80 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
33d90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
33da0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
33db0 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
33dc0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
33dd0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
33de0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
33df0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
33e00 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
33e10 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
33e20 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
33e30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
33e40 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
33e50 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
33e60 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c  pointers to nCel
33e70 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65  l b-tree page ce
33e80 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43  lls. The .** szC
33e90 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  ell[] array cont
33ea0 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
33eb0 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63   bytes of each c
33ec0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
33ed0 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74  on.** replaces t
33ee0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
33ef0 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20  nts of page pPg 
33f00 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
33f10 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s of the cell.**
33f20 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f   array..**.** So
33f30 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
33f40 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20  in apCell[] may 
33f50 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
33f60 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73  red in pPg. This
33f70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  .** function wor
33f80 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ks around proble
33f90 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69  ms caused by thi
33fa0 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f  s by making a co
33fb0 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75  py of any .** su
33fc0 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  ch cells before 
33fd0 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
33fe0 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  page data..**.**
33ff0 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72   The MemPage.nFr
34000 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61  ee field is inva
34010 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
34020 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
34030 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
34040 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
34050 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63  ller to set it c
34060 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
34070 74 69 63 20 76 6f 69 64 20 72 65 62 75 69 6c 64  tic void rebuild
34080 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
34090 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
340a0 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
340b0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
340c0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
340d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
340e0 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f  * Final number o
340f0 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
34100 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
34110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34120 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
34130 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
34140 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
34150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
34160 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
34170 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
34180 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
34190 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
341a0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
341b0 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a   header on pPg *
341c0 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  /.  u8 * const a
341d0 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
341e0 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
341f0 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
34200 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e  for pPg */.  con
34210 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  st int usableSiz
34220 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
34230 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a  ableSize;.  u8 *
34240 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
34250 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d  Data[usableSize]
34260 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  ;.  int i;.  u8 
34270 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d  *pCellptr = pPg-
34280 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20  >aCellIdx;.  u8 
34290 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
342a0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
342b0 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
342c0 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20  .  u8 *pData;.. 
342d0 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61   i = get2byte(&a
342e0 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  Data[hdr+5]);.  
342f0 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c  memcpy(&pTmp[i],
34300 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62   &aData[i], usab
34310 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20  leSize - i);..  
34320 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20  pData = pEnd;.  
34330 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
34340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
34350 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69  pCell = apCell[i
34360 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c  ];.    if( pCell
34370 3e 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c  >aData && pCell<
34380 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43  pEnd ){.      pC
34390 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
343a0 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
343b0 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73  }.    pData -= s
343c0 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d 65  zCell[i];.    me
343d0 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c  mcpy(pData, pCel
343e0 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20  l, szCell[i]);. 
343f0 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
34400 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61  lptr, (pData - a
34410 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
34420 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 61  lptr += 2;.    a
34430 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d  ssert( szCell[i]
34440 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
34450 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52  g, pCell) || COR
34460 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74  RUPT_DB );.    t
34470 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b  estcase( szCell[
34480 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  i]==cellSizePtr(
34490 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20  pPg,pCell) );.  
344a0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
344b0 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
344c0 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
344d0 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
344e0 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
344f0 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
34500 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
34510 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
34520 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
34530 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
34540 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
34550 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
34560 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
34570 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
34580 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
34590 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
345a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  0;.}../*.** Arra
345b0 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
345c0 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
345d0 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
345e0 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
345f0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
34600 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
34610 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
34620 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
34630 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
34640 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
34650 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
34660 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
34670 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
34680 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
34690 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
346a0 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
346b0 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
346c0 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
346d0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
346e0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
346f0 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
34700 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
34710 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
34720 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
34730 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
34740 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
34750 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
34760 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
34770 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
34780 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
34790 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
347a0 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
347b0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
347c0 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
347d0 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
347e0 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
347f0 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
34800 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
34810 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
34820 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
34830 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
34840 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
34850 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
34860 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
34870 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
34880 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
34890 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
348a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
348b0 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
348c0 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
348d0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
348e0 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
348f0 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
34900 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
34910 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
34920 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
34930 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
34940 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
34950 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
34960 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
34970 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
34980 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
34990 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
349a0 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
349b0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
349c0 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
349d0 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
349e0 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
349f0 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
34a00 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
34a10 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
34a20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
34a30 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
34a40 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
34a50 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
34a60 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
34a70 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
34a80 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
34a90 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
34aa0 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
34ab0 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
34ac0 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
34ad0 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
34ae0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
34af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
34b00 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
34b10 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
34b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b30 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
34b40 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
34b50 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
34b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34b70 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
34b80 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
34b90 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bb0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
34bc0 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
34bd0 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
34be0 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
34bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34c00 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
34c10 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
34c20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
34c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
34c50 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
34c60 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
34c70 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
34c80 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
34c90 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
34ca0 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34cc0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
34cd0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zes */.){.  int 
34ce0 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
34cf0 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
34d00 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
34d10 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ta;.  const int 
34d20 62 46 72 65 65 6c 69 73 74 20 3d 20 61 44 61 74  bFreelist = aDat
34d30 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61 5b 32 5d  a[1] || aData[2]
34d40 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
34d50 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68  UPT_DB || pPg->h
34d60 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  drOffset==0 );  
34d70 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
34d80 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20  d on page 1 */. 
34d90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
34da0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
34db0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b   sz = szCell[i];
34dc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
34dd0 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20   u8 *pSlot;.    
34de0 69 66 28 20 62 46 72 65 65 6c 69 73 74 3d 3d 30  if( bFreelist==0
34df0 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
34e00 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 20 73  eFindSlot(pPg, s
34e10 7a 2c 20 26 72 63 2c 20 30 29 29 3d 3d 30 20 29  z, &rc, 0))==0 )
34e20 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d  {.      pData -=
34e30 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70   sz;.      if( p
34e40 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65  Data<pBegin ) re
34e50 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53  turn 1;.      pS
34e60 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  lot = pData;.   
34e70 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53   }.    memcpy(pS
34e80 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  lot, apCell[i], 
34e90 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  sz);.    put2byt
34ea0 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c  e(pCellptr, (pSl
34eb0 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ot - aData));.  
34ec0 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
34ed0 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d  .  }.  *ppData =
34ee0 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e   pData;.  return
34ef0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72   0;.}../*.** Arr
34f00 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
34f10 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
34f20 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
34f30 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
34f40 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  l .** contains t
34f50 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
34f60 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
34f70 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
34f80 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70  n adds the.** sp
34f90 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ace associated w
34fa0 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  ith each cell in
34fb0 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20   the array that 
34fc0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
34fd0 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74  red .** within t
34fe0 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74  he body of pPg t
34ff0 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c  o the pPg free-l
35000 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f  ist. The cell-po
35010 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72  inters and other
35020 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
35030 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75  e page are not u
35040 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
35050 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
35060 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
35070 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64  mber of cells ad
35080 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ded to the free-
35090 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
350a0 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61  int pageFreeArra
350b0 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
350c0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
350d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
350e0 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  edit */.  int nC
350f0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
35100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c            /* Cel
35110 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ls to delete */.
35120 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
35130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35140 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
35150 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
35160 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
35170 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
35180 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
35190 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e  */.){.  u8 * con
351a0 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
351b0 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
351c0 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
351d0 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
351e0 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20  leSize];.  u8 * 
351f0 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26  const pStart = &
35200 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66  aData[pPg->hdrOf
35210 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e  fset + 8 + pPg->
35220 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
35230 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20   int nRet = 0;. 
35240 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 46   int i;.  u8 *pF
35250 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
35260 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
35270 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
35280 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
35290 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
352a0 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d  .    if( pCell>=
352b0 70 53 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c  pStart && pCell<
352c0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  pEnd ){.      in
352d0 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d  t sz = szCell[i]
352e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
352f0 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
35300 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
35310 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
35320 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
35330 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
35340 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
35350 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
35360 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
35370 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
35380 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
35390 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
353a0 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
353b0 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
353c0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
353d0 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
353e0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
353f0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
35400 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
35410 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
35420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
35430 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
35440 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
35450 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
35460 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
35470 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
35480 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
35490 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
354a0 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
354b0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
354c0 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
354d0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
354e0 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
354f0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20  pointers to and 
35500 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c  sizes of all cel
35510 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ls in the.** pag
35520 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
35530 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  d.  The current 
35540 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70  page, pPg, has p
35550 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20  Pg->nCell cells 
35560 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
35570 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20   apCell[iOld].  
35580 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c  After balancing,
35590 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c   this page shoul
355a0 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c  d hold nNew cell
355b0 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74  s.** starting at
355c0 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a   apCell[iNew]..*
355d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
355e0 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
355f0 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74  ssary adjustment
35600 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68 61 74  s to pPg so that
35610 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20   it contains.** 
35620 74 68 65 20 63 6f 72 72 65 63 74 20 63 65 6c 6c  the correct cell
35630 73 20 61 66 74 65 72 20 62 65 69 6e 67 20 62 61  s after being ba
35640 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  lanced..**.** Th
35650 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
35660 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68  ld is invalid wh
35670 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35680 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20   returns. It is 
35690 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  the.** responsib
356a0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
356b0 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
356c0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
356d0 69 63 20 76 6f 69 64 20 65 64 69 74 50 61 67 65  ic void editPage
356e0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
356f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35700 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
35710 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
35720 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Old,            
35730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
35740 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
35750 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70  l currently on p
35760 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  age */.  int iNe
35770 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
35780 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
35790 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63  x of new first c
357a0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  ell on page */. 
357b0 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20   int nNew,      
357c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357d0 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
357e0 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
357f0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
35800 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
35810 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
35820 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
35830 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
35840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35850 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
35860 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  izes */.){.  u8 
35870 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
35880 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f  pPg->aData;.  co
35890 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
358a0 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  g->hdrOffset;.  
358b0 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50  u8 *pBegin = &pP
358c0 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77  g->aCellIdx[nNew
358d0 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65   * 2];.  int nCe
358e0 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b  ll = pPg->nCell;
358f0 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20         /* Cells 
35900 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f  stored on pPg */
35910 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20  .  u8 *pData;.  
35920 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20  u8 *pCellptr;.  
35930 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c  int i;.  int iOl
35940 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50  dEnd = iOld + pP
35950 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e  g->nCell + pPg->
35960 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74  nOverflow;.  int
35970 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20   iNewEnd = iNew 
35980 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  + nNew;..#ifdef 
35990 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
359a0 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
359b0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
359c0 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
359d0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70  );.  memcpy(pTmp
359e0 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42  , aData, pPg->pB
359f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
35a00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d  #endif..  /* Rem
35a10 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  ove cells from t
35a20 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
35a30 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
35a40 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20    if( iOld<iNew 
35a50 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66  ){.    int nShif
35a60 74 20 3d 20 70 61 67 65 46 72 65 65 41 72 72 61  t = pageFreeArra
35a70 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20  y(.        pPg, 
35a80 69 4e 65 77 2d 69 4f 6c 64 2c 20 26 61 70 43 65  iNew-iOld, &apCe
35a90 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c  ll[iOld], &szCel
35aa0 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20 29 3b 0a 20  l[iOld].    );. 
35ab0 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e     memmove(pPg->
35ac0 61 43 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e  aCellIdx, &pPg->
35ad0 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a  aCellIdx[nShift*
35ae0 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20  2], nCell*2);.  
35af0 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66    nCell -= nShif
35b00 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e 65  t;.  }.  if( iNe
35b10 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29  wEnd < iOldEnd )
35b20 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70  {.    nCell -= p
35b30 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20  ageFreeArray(.  
35b40 20 20 20 20 20 20 70 50 67 2c 20 69 4f 6c 64 45        pPg, iOldE
35b50 6e 64 2d 69 4e 65 77 45 6e 64 2c 20 26 61 70 43  nd-iNewEnd, &apC
35b60 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c 20 26 73  ell[iNewEnd], &s
35b70 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20  zCell[iNewEnd]. 
35b80 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61     );.  }..  pDa
35b90 74 61 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32  ta = &aData[get2
35ba0 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 61 44 61  byteNotZero(&aDa
35bb0 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69  ta[hdr+5])];.  i
35bc0 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
35bd0 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
35be0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  fail;..  /* Add 
35bf0 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 73 74 61  cells to the sta
35c00 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
35c10 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c  /.  if( iNew<iOl
35c20 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64  d ){.    int nAd
35c30 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 69 4f 6c  d = MIN(nNew,iOl
35c40 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20 61 73 73  d-iNew);.    ass
35c50 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e 65 77 29  ert( (iOld-iNew)
35c60 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c 6c 3d 3d  <nNew || nCell==
35c70 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
35c80 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
35c90 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
35ca0 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43  .    memmove(&pC
35cb0 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32 5d 2c 20  ellptr[nAdd*2], 
35cc0 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a  pCellptr, nCell*
35cd0 32 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  2);.    if( page
35ce0 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
35cf0 20 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67         pPg, pBeg
35d00 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c  in, &pData, pCel
35d10 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  lptr,.          
35d20 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4e  nAdd, &apCell[iN
35d30 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65  ew], &szCell[iNe
35d40 77 5d 0a 20 20 20 20 29 20 29 20 67 6f 74 6f 20  w].    ) ) goto 
35d50 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20  editpage_fail;. 
35d60 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64 64     nCell += nAdd
35d70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
35d80 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
35d90 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ls */.  for(i=0;
35da0 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f   i<pPg->nOverflo
35db0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  w; i++){.    int
35dc0 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b   iCell = (iOld +
35dd0 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d 29   pPg->aiOvfl[i])
35de0 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69 66 28   - iNew;.    if(
35df0 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69 43 65   iCell>=0 && iCe
35e00 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20  ll<nNew ){.     
35e10 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67   pCellptr = &pPg
35e20 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c  ->aCellIdx[iCell
35e30 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d   * 2];.      mem
35e40 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 32  move(&pCellptr[2
35e50 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43  ], pCellptr, (nC
35e60 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32  ell - iCell) * 2
35e70 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  );.      nCell++
35e80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  ;.      if( page
35e90 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
35ea0 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42           pPg, pB
35eb0 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43  egin, &pData, pC
35ec0 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20  ellptr,.        
35ed0 20 20 20 20 31 2c 20 26 61 70 43 65 6c 6c 5b 69      1, &apCell[i
35ee0 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c 20 26 73  Cell + iNew], &s
35ef0 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e  zCell[iCell + iN
35f00 65 77 5d 0a 20 20 20 20 20 20 29 20 29 20 67 6f  ew].      ) ) go
35f10 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
35f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
35f30 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c 73 20 74  * Append cells t
35f40 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
35f50 20 70 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c   page */.  pCell
35f60 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c  ptr = &pPg->aCel
35f70 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
35f80 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41   if( pageInsertA
35f90 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
35fa0 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
35fb0 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
35fc0 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c       nNew-nCell,
35fd0 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43   &apCell[iNew+nC
35fe0 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e  ell], &szCell[iN
35ff0 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29 20 29 20  ew+nCell].  ) ) 
36000 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
36010 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  il;..  pPg->nCel
36020 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d  l = nNew;.  pPg-
36030 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
36040 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
36050 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
36060 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
36070 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36080 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
36090 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
360a0 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  _DEBUG.  for(i=0
360b0 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52  ; i<nNew && !COR
360c0 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20  RUPT_DB; i++){. 
360d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61     u8 *pCell = a
360e0 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20  pCell[i+iNew];. 
360f0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 67 65     int iOff = ge
36100 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61 43 65  t2byte(&pPg->aCe
36110 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20  llIdx[i*2]);.   
36120 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74   if( pCell>=aDat
36130 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44 61 74  a && pCell<&aDat
36140 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
36150 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  leSize] ){.     
36160 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
36170 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
36180 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
36190 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c   0==memcmp(pCell
361a0 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20  , &aData[iOff], 
361b0 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 20  szCell[i+iNew]) 
361c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
361d0 20 72 65 74 75 72 6e 3b 0a 20 65 64 69 74 70 61   return;. editpa
361e0 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a 20 55 6e  ge_fail:.  /* Un
361f0 61 62 6c 65 20 74 6f 20 65 64 69 74 20 74 68 69  able to edit thi
36200 73 20 70 61 67 65 2e 20 52 65 62 75 69 6c 64 20  s page. Rebuild 
36210 69 74 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20  it from scratch 
36220 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20 20 72 65  instead. */.  re
36230 62 75 69 6c 64 50 61 67 65 28 70 50 67 2c 20 6e  buildPage(pPg, n
36240 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65  New, &apCell[iNe
36250 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77  w], &szCell[iNew
36260 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
36270 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
36280 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
36290 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
362a0 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
362b0 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
362c0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
362d0 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
362e0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
362f0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
36300 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
36310 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
36320 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
36330 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
36340 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
36350 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
36360 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
36370 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
36380 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
36390 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
363a0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
363b0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
363c0 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
363d0 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
363e0 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
363f0 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
36400 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
36410 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
36420 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
36430 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
36440 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
36450 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
36460 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
36470 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
36480 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
36490 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
364a0 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
364b0 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
364c0 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
364d0 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
364e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
364f0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
36500 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
36510 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
36520 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
36530 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
36540 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
36550 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
36560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36570 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
36580 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
36590 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
365a0 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
365b0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
365c0 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
365d0 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
365e0 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
365f0 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
36600 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
36610 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
36620 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
36630 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
36640 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
36650 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
36660 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
36670 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
36680 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
36690 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
366a0 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
366b0 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
366c0 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
366d0 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
366e0 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
366f0 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
36700 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
36710 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
36720 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
36730 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
36740 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
36750 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
36760 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
36770 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
36780 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
36790 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
367a0 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
367b0 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
367c0 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
367d0 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
367e0 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
367f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
36800 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
36810 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
36820 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
36830 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
36840 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
36850 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
36860 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
36870 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
36880 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
36890 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
368a0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
368b0 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
368c0 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
368d0 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
368e0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
368f0 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
36900 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
36910 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
36920 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
36930 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
36940 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
36950 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
36960 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
36970 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
36980 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
36990 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
369a0 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
369b0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
369c0 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
369d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
369e0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
369f0 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
36a00 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
36a10 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
36a20 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
36a30 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
36a40 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
36a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a60 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
36a70 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
36a80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
36a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36aa0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
36ab0 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
36ac0 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
36ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36ae0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
36af0 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
36b00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
36b10 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
36b20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
36b30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
36b40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
36b50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
36b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36b70 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
36b80 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65   );..  /* This e
36b90 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69  rror condition i
36ba0 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
36bb0 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
36bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
36bd0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36be0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 20 72  e->nCell==0) ) r
36bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
36c00 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
36c10 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
36c20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
36c30 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
36c40 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
36c50 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
36c60 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
36c70 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
36c80 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
36c90 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
36ca0 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
36cb0 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
36cc0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
36cd0 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
36ce0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
36cf0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
36d00 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
36d10 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
36d20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36d30 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
36d40 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
36d50 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36d60 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30   pPage->apOvfl[0
36d70 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  ];.    u16 szCel
36d80 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
36d90 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
36da0 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
36db0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
36dc0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36dd0 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
36de0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
36df0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
36e00 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
36e10 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
36e20 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
36e30 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
36e40 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
36e50 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
36e60 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 4e    rebuildPage(pN
36e70 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
36e80 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e 65  szCell);.    pNe
36e90 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  w->nFree = pBt->
36ea0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e 65  usableSize - pNe
36eb0 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d 20  w->cellOffset - 
36ec0 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20 20  2 - szCell;..   
36ed0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
36ee0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
36ef0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
36f00 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
36f10 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
36f20 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
36f30 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
36f40 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
36f50 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
36f60 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
36f70 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
36f80 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
36f90 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
36fa0 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
36fb0 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
36fc0 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
36fd0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
36fe0 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
36ff0 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
37000 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
37010 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
37020 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
37030 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
37040 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
37050 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
37060 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
37070 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
37080 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
37090 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
370a0 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
370b0 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
370c0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
370d0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
370e0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
370f0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
37100 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
37110 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
37120 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
37130 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
37140 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
37150 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
37160 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
37170 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
37180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37190 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
371a0 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
371b0 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
371c0 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
371d0 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
371e0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
371f0 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
37200 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
37210 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
37220 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
37230 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
37240 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
37250 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
37260 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
37270 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
37280 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
37290 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
372a0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
372b0 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
372c0 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
372d0 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
372e0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
372f0 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
37300 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
37310 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
37320 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
37330 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
37340 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
37350 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
37360 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
37370 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
37380 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
37390 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
373a0 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
373b0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
373c0 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
373d0 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
373e0 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
373f0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
37400 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
37410 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
37420 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
37430 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
37440 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
37450 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
37460 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
37470 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
37480 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
37490 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
374a0 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
374b0 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
374c0 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
374d0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
374e0 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
374f0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
37500 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
37510 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
37520 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
37530 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
37540 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
37550 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
37560 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
37570 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
37580 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
37590 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
375a0 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
375b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
375c0 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
375d0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
375e0 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
375f0 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
37600 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
37610 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
37620 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
37630 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
37640 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
37650 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
37660 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
37670 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
37680 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
37690 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
376a0 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
376b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
376c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
376d0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
376e0 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
376f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
37700 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
37710 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
37720 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
37730 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
37740 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
37750 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
37760 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
37770 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
37780 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
37790 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
377a0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
377b0 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
377c0 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
377d0 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
377e0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
377f0 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
37800 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
37810 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
37820 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
37830 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
37840 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
37850 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
37860 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
37870 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
37880 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
37890 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
378a0 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
378b0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
378c0 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
378d0 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
378e0 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
378f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
37900 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
37910 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
37920 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
37930 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
37940 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
37950 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
37960 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
37970 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
37980 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
37990 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
379a0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
379b0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
379c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
379d0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
379e0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
379f0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
37a00 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
37a10 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
37a20 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
37a30 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
37a40 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
37a50 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
37a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37a70 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
37a80 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
37a90 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
37aa0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
37ab0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
37ac0 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
37ad0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
37ae0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
37af0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
37b00 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
37b10 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
37b20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
37b30 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
37b40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37b50 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
37b60 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
37b70 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
37b80 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
37b90 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
37ba0 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
37bb0 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
37bc0 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
37bd0 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
37be0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
37bf0 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
37c00 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
37c10 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
37c20 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
37c30 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
37c40 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
37c50 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
37c60 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
37c70 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
37c80 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
37c90 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37ca0 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
37cb0 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
37cc0 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
37cd0 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
37ce0 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
37cf0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
37d00 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
37d10 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
37d20 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
37d30 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
37d40 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
37d50 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
37d60 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
37d70 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
37d80 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
37d90 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
37da0 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
37db0 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
37dc0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
37dd0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
37de0 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
37df0 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
37e00 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
37e10 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
37e20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
37e30 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
37e40 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
37e50 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
37e60 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
37e70 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
37e80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37e90 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
37ea0 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
37eb0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
37ec0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
37ed0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
37ee0 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
37ef0 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
37f00 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
37f10 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
37f20 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
37f30 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
37f40 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
37f50 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
37f60 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
37f70 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
37f80 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
37f90 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
37fa0 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
37fb0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
37fc0 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
37fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
37fe0 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
37ff0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
38000 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
38010 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
38020 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
38030 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
38040 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
38050 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
38060 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
38070 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
38080 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
38090 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
380a0 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
380b0 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
380c0 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
380d0 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
380e0 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
380f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
38100 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
38110 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
38120 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
38130 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
38140 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
38150 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
38160 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
38170 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
38180 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
38190 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
381a0 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
381b0 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
381c0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
381d0 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
381e0 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
381f0 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
38200 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
38210 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
38220 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
38230 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
38240 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
38250 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
38260 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
38270 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
38280 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
38290 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
382a0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
382b0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
382c0 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
382d0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
382e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
382f0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
38300 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
38310 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
38320 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
38330 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
38340 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
38350 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
38360 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
38370 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
38380 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
38390 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
383a0 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
383b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
383c0 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
383d0 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
383e0 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
383f0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
38400 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
38410 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
38420 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
38430 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
38440 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
38450 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
38460 6f