/ Hex Artifact Content
Login

Artifact a00a7c4809d642bf6c63979e73face9fed53dc66:


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 2f  ARED_CACHE */../
3a70: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3a80: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 74 6f  ng structure sto
3a90: 72 65 73 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  res the in-memor
3aa0: 79 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 75 73  y pointer map us
3ab0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 0a 2a 2a 20  ed for newly.** 
3ac0: 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20  allocated pages 
3ad0: 69 6e 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61 6e  in UNLOCKED tran
3ae0: 73 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70  sactions. Such p
3af0: 61 67 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ages are always 
3b00: 61 6c 6c 6f 63 61 74 65 64 20 0a 2a 2a 20 69 6e  allocated .** in
3b10: 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c   a contiguous bl
3b20: 6f 63 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e  ock (from the en
3b30: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73  d of the file) s
3b40: 74 61 72 74 69 6e 67 20 77 69 74 68 20 70 61 67  tarting with pag
3b50: 65 0a 2a 2a 20 42 74 72 65 65 50 74 72 6d 61 70  e.** BtreePtrmap
3b60: 2e 69 46 69 72 73 74 2e 0a 2a 2a 20 0a 2a 2a 20  .iFirst..** .** 
3b70: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
3b80: 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 70  for the parent p
3b90: 61 67 65 20 69 46 69 72 73 74 20 69 73 20 73 74  age iFirst is st
3ba0: 6f 72 65 64 20 69 6e 20 61 50 74 72 5b 30 5d 2e  ored in aPtr[0].
3bb0: 20 46 6f 72 0a 2a 2a 20 28 69 46 69 72 73 74 2b   For.** (iFirst+
3bc0: 31 29 2c 20 61 50 74 72 5b 31 5d 2e 20 41 20 7a  1), aPtr[1]. A z
3bd0: 65 72 6f 20 76 61 6c 75 65 20 69 6e 64 69 63 61  ero value indica
3be0: 74 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  tes that the pag
3bf0: 65 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 62 65 65  e has not.** bee
3c00: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  n allocated..**.
3c10: 2a 2a 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73  **.*/..typedef s
3c20: 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e  truct RollbackEn
3c30: 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72  try RollbackEntr
3c40: 79 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  y;.typedef struc
3c50: 74 20 50 74 72 6d 61 70 45 6e 74 72 79 20 50 74  t PtrmapEntry Pt
3c60: 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74 72 75 63  rmapEntry;.struc
3c70: 74 20 50 74 72 6d 61 70 45 6e 74 72 79 20 7b 0a  t PtrmapEntry {.
3c80: 20 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20    Pgno parent;. 
3c90: 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74   u8 eType;.};.st
3ca0: 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74  ruct RollbackEnt
3cb0: 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ry {.  Pgno pgno
3cc0: 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b  ;.  Pgno parent;
3cd0: 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a  .  u8 eType;.};.
3ce0: 0a 73 74 72 75 63 74 20 42 74 72 65 65 50 74 72  .struct BtreePtr
3cf0: 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69 46 69  map {.  Pgno iFi
3d00: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
3d10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3d20: 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72   new page number
3d30: 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20 20 69   aPtr[0] */..  i
3d40: 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20 20 20  nt nPtrAlloc;   
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d60: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
3d70: 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72 61 79   of aPtr[] array
3d80: 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e 74 72   */.  PtrmapEntr
3d90: 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20 20 20  y *aPtr;        
3da0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
3db0: 66 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  f parent page nu
3dc0: 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  mbers */..  int 
3dd0: 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20 20 20  nSvpt;          
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3df0: 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53 76 70  sed size of aSvp
3e00: 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  t[] array */.  i
3e10: 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b 20 20  nt nSvptAlloc;  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e30: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
3e40: 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f 0a 20   of aSvpt[] */. 
3e50: 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20 20 20   int *aSvpt;    
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c 6c 62   /* First aRollb
3e80: 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f 72 20  ack[] entry for 
3e90: 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f 0a 0a  savepoint i */..
3ea0: 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b 3b    int nRollback;
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65 20 6f    /* Used size o
3ed0: 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72  f aRollback[] ar
3ee0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ray */.  int nRo
3ef0: 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20 20 20  llbackAlloc;    
3f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3f10: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52  cated size of aR
3f20: 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20  ollback[] array 
3f30: 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74  */.  RollbackEnt
3f40: 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b 20 20  ry *aRollback;  
3f50: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
3f60: 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72 69 65   rollback entrie
3f70: 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  s */.};..static 
3f80: 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61 70 53  int btreePtrmapS
3f90: 74 6f 72 65 28 0a 20 20 42 74 72 65 65 50 74 72  tore(.  BtreePtr
3fa0: 6d 61 70 20 2a 70 4d 61 70 2c 20 0a 20 20 50 67  map *pMap, .  Pg
3fb0: 6e 6f 20 70 67 6e 6f 2c 20 0a 20 20 75 38 20 65  no pgno, .  u8 e
3fc0: 54 79 70 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61  Type, .  Pgno pa
3fd0: 72 65 6e 74 0a 29 7b 0a 20 20 69 66 28 20 70 67  rent.){.  if( pg
3fe0: 6e 6f 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74  no>=pMap->iFirst
3ff0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e 74   ){.    int iEnt
4000: 72 79 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61 70  ry = pgno - pMap
4010: 2d 3e 69 46 69 72 73 74 3b 0a 0a 20 20 20 20 2f  ->iFirst;..    /
4020: 2a 20 47 72 6f 77 20 74 68 65 20 61 50 74 72 5b  * Grow the aPtr[
4030: 5d 20 61 72 72 61 79 20 69 66 20 72 65 71 75 69  ] array if requi
4040: 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  red */.    if( i
4050: 45 6e 74 72 79 3e 3d 70 4d 61 70 2d 3e 6e 50 74  Entry>=pMap->nPt
4060: 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  rAlloc ){.      
4070: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4080: 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f 20 70 4d 61  >nPtrAlloc ? pMa
4090: 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 2a 32 20 3a  p->nPtrAlloc*2 :
40a0: 20 31 36 3b 0a 20 20 20 20 20 20 50 74 72 6d 61   16;.      Ptrma
40b0: 70 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20 28  pEntry *aNew = (
40c0: 50 74 72 6d 61 70 45 6e 74 72 79 2a 29 73 71 6c  PtrmapEntry*)sql
40d0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
40e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
40f0: 74 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28  tr, nNew*sizeof(
4100: 50 74 72 6d 61 70 45 6e 74 72 79 29 0a 20 20 20  PtrmapEntry).   
4110: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
4120: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
4130: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4140: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
4150: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
4160: 20 6e 42 79 74 65 20 3d 20 28 6e 4e 65 77 2d 70   nByte = (nNew-p
4170: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29 2a  Map->nPtrAlloc)*
4180: 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e 74  sizeof(PtrmapEnt
4190: 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ry);.        mem
41a0: 73 65 74 28 26 61 4e 65 77 5b 70 4d 61 70 2d 3e  set(&aNew[pMap->
41b0: 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20 30 2c 20 6e  nPtrAlloc], 0, n
41c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Byte);.        p
41d0: 4d 61 70 2d 3e 61 50 74 72 20 3d 20 61 4e 65 77  Map->aPtr = aNew
41e0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e  ;.        pMap->
41f0: 6e 50 74 72 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77  nPtrAlloc = nNew
4200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4210: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
4220: 6e 74 72 79 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ntry to the roll
4230: 62 61 63 6b 20 6c 6f 67 20 69 66 20 72 65 71 75  back log if requ
4240: 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ired */.    if( 
4250: 70 4d 61 70 2d 3e 6e 53 76 70 74 3e 30 20 26 26  pMap->nSvpt>0 &&
4260: 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74   pMap->aPtr[iEnt
4270: 72 79 5d 2e 70 61 72 65 6e 74 20 29 7b 0a 20 20  ry].parent ){.  
4280: 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e 52      if( pMap->nR
4290: 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61 70 2d 3e 6e  ollback>=pMap->n
42a0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 29 7b  RollbackAlloc ){
42b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  .        int nNe
42c0: 77 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  w = pMap->nRollb
42d0: 61 63 6b 20 3f 20 70 4d 61 70 2d 3e 6e 52 6f 6c  ack ? pMap->nRol
42e0: 6c 62 61 63 6b 2a 32 20 3a 20 31 36 3b 0a 20 20  lback*2 : 16;.  
42f0: 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45 6e        RollbackEn
4300: 74 72 79 20 2a 61 4e 65 77 20 3d 20 28 52 6f 6c  try *aNew = (Rol
4310: 6c 62 61 63 6b 45 6e 74 72 79 2a 29 73 71 6c 69  lbackEntry*)sqli
4320: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
4330: 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61           pMap->a
4340: 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e 65 77 2a 73  Rollback, nNew*s
4350: 69 7a 65 6f 66 28 52 6f 6c 6c 62 61 63 6b 45 6e  izeof(RollbackEn
4360: 74 72 79 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  try).        );.
4370: 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
4380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
4390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
43a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65  OMEM;.        }e
43b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
43c0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 20 3d  Map->aRollback =
43d0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   aNew;.         
43e0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
43f0: 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20  Alloc = nNew;.  
4400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4410: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
4420: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
4430: 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f 20 3d 20 70  llback].pgno = p
4440: 67 6e 6f 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d  gno;.      pMap-
4450: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d  >aRollback[pMap-
4460: 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 61 72 65  >nRollback].pare
4470: 6e 74 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72 5b  nt = pMap->aPtr[
4480: 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 3b 0a  iEntry].parent;.
4490: 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c        pMap->aRol
44a0: 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c  lback[pMap->nRol
44b0: 6c 62 61 63 6b 5d 2e 65 54 79 70 65 20 3d 20 70  lback].eType = p
44c0: 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79  Map->aPtr[iEntry
44d0: 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 7d 0a 0a  ].eType;.    }..
44e0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
44f0: 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 2a  e aPtr[] array *
4500: 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50 74 72  /.    pMap->aPtr
4510: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20  [iEntry].parent 
4520: 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 70 4d  = parent;.    pM
4530: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
4540: 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a  .eType = eType;.
4550: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
4560: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4570: 2a 20 4f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * Open savepoint
4580: 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 69 66 20   iSavepoint, if 
4590: 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
45a0: 79 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  y open..*/.stati
45b0: 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61  c int btreePtrma
45c0: 70 42 65 67 69 6e 28 42 74 72 65 65 50 74 72 6d  pBegin(BtreePtrm
45d0: 61 70 20 2a 70 4d 61 70 2c 20 69 6e 74 20 6e 53  ap *pMap, int nS
45e0: 76 70 74 29 7b 0a 20 20 69 66 28 20 6e 53 76 70  vpt){.  if( nSvp
45f0: 74 3c 70 4d 61 70 2d 3e 6e 53 76 70 74 20 29 7b  t<pMap->nSvpt ){
4600: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4610: 69 66 28 20 6e 53 76 70 74 3e 3d 70 4d 61 70 2d  if( nSvpt>=pMap-
4620: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 29 7b 0a 20  >nSvptAlloc ){. 
4630: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
4640: 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63  pMap->nSvptAlloc
4650: 20 3f 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c   ? pMap->nSvptAl
4660: 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20  loc*2 : 16;.    
4670: 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 73 71    int *aNew = sq
4680: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d  lite3_realloc(pM
4690: 61 70 2d 3e 61 53 76 70 74 2c 20 73 69 7a 65 6f  ap->aSvpt, sizeo
46a0: 66 28 69 6e 74 29 20 2a 20 6e 4e 65 77 29 3b 0a  f(int) * nNew);.
46b0: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
46c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
46d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
46e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
46f0: 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76         pMap->aSv
4700: 70 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  pt = aNew;.     
4710: 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c     pMap->nSvptAl
4720: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  loc = nNew;.    
4730: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
4740: 6f 72 28 69 3d 70 4d 61 70 2d 3e 6e 53 76 70 74  or(i=pMap->nSvpt
4750: 3b 20 69 3c 6e 53 76 70 74 3b 20 69 2b 2b 29 7b  ; i<nSvpt; i++){
4760: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76  .      pMap->aSv
4770: 70 74 5b 69 5d 20 3d 20 70 4d 61 70 2d 3e 6e 52  pt[i] = pMap->nR
4780: 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  ollback;.    }. 
4790: 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d     pMap->nSvpt =
47a0: 20 6e 53 76 70 74 3b 0a 20 20 7d 0a 0a 20 20 72   nSvpt;.  }..  r
47b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
47c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
47d0: 63 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50  ck (if op==SAVEP
47e0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f  OINT_ROLLBACK) o
47f0: 72 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70  r release (if op
4800: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4810: 41 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ASE).** savepoin
4820: 74 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74  t iSvpt..*/.stat
4830: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72  ic void btreePtr
4840: 6d 61 70 45 6e 64 28 42 74 72 65 65 50 74 72 6d  mapEnd(BtreePtrm
4850: 61 70 20 2a 70 4d 61 70 2c 20 69 6e 74 20 6f 70  ap *pMap, int op
4860: 2c 20 69 6e 74 20 69 53 76 70 74 29 7b 0a 20 20  , int iSvpt){.  
4870: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
4880: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
4890: 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
48a0: 52 45 4c 45 41 53 45 20 29 3b 0a 20 20 61 73 73  RELEASE );.  ass
48b0: 65 72 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c  ert( iSvpt>=0 ||
48c0: 20 28 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f   (iSvpt==-1 && o
48d0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
48e0: 4c 42 41 43 4b 29 20 29 3b 0a 20 20 69 66 28 20  LBACK) );.  if( 
48f0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 70  iSvpt<0 ){.    p
4900: 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b 0a  Map->nSvpt = 0;.
4910: 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62      pMap->nRollb
4920: 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  ack = 0;.    mem
4930: 73 65 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c 20  set(pMap->aPtr, 
4940: 30 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  0, sizeof(Pgno) 
4950: 2a 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f  * pMap->nPtrAllo
4960: 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c);.  }else if( 
4970: 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e 53 76 70  iSvpt<pMap->nSvp
4980: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d  t ){.    if( op=
4990: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
49a0: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ACK ){.      int
49b0: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
49c0: 69 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  i=pMap->nRollbac
49d0: 6b 2d 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61  k-1; ii>=pMap->a
49e0: 53 76 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d  Svpt[iSvpt]; ii-
49f0: 2d 29 7b 0a 20 20 20 20 20 20 20 20 52 6f 6c 6c  -){.        Roll
4a00: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4a10: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4a20: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 50 74 72  ii];.        Ptr
4a30: 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  mapEntry *pEntry
4a40: 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b 70   = &pMap->aPtr[p
4a50: 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69  ->pgno - pMap->i
4a60: 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20 20  First];.        
4a70: 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 20 3d  pEntry->parent =
4a80: 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20   p->parent;.    
4a90: 20 20 20 20 70 45 6e 74 72 79 2d 3e 65 54 79 70      pEntry->eTyp
4aa0: 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20  e = p->eType;.  
4ab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4ac0: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 69 53  pMap->nSvpt = iS
4ad0: 76 70 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50  vpt + (op==SAVEP
4ae0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  OINT_ROLLBACK);.
4af0: 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62      pMap->nRollb
4b00: 61 63 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70  ack = pMap->aSvp
4b10: 74 5b 69 53 76 70 74 5d 3b 0a 20 20 7d 0a 7d 0a  t[iSvpt];.  }.}.
4b20: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
4b30: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
4b40: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
4b50: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4b60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68   */../*.***** Th
4b70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4b80: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
4b90: 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a  ert() only ****.
4ba0: 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  **.** Verify tha
4bb0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
4bc0: 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ds the mutex on 
4bd0: 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  its BtShared.*/.
4be0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4bf0: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
4c00: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c10: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
4c20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
4c30: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
4c40: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
4c50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  if../*.** Invali
4c60: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
4c70: 77 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63  w cache of the c
4c80: 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
4c90: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4ca0: 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  nt..** on the sh
4cb0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
4cc0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65  ture pBt..*/.#de
4cd0: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
4ce0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
4cf0: 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  r) (pCur->curFla
4d00: 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
4d10: 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dOvfl)../*.** In
4d20: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
4d30: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
4d40: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
4d50: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
4d60: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
4d70: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
4d80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4d90: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
4da0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
4db0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
4dc0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
4dd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4de0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4df0: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
4e00: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4e10: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4e20: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
4e30: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
4e40: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
4e50: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
4e60: 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  B./*.** This fun
4e70: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
4e80: 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
4e90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4ea0: 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69   a table.** to i
4eb0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
4ec0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
4ed0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
4ee0: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
4ef0: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
4f00: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  ing modified..**
4f10: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
4f20: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
4f30: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65  true, then the e
4f40: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
4f50: 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69  f the.** table i
4f60: 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65  s about to be de
4f70: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4f80: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ase invalidate a
4f90: 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63  ll incrblob.** c
4fa0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61  ursors open on a
4fb0: 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68  ny row within th
4fc0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
4fd0: 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e  t-page pgnoRoot.
4fe0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
4ff0: 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73  , if argument is
5000: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61  ClearTable is fa
5010: 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  lse, then the ro
5020: 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20  w with.** rowid 
5030: 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65  iRow is being re
5040: 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65  placed or delete
5050: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
5060: 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e  invalidate.** on
5070: 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f  ly those incrblo
5080: 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
5090: 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20  n that specific 
50a0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  row..*/.static v
50b0: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  oid invalidateIn
50c0: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20  crblobCursors(. 
50d0: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
50f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
5100: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20   check */.  i64 
5110: 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20  iRow,           
5120: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
5130: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
5140: 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  hanging */.  int
5150: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20   isClearTable   
5160: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5170: 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69  all rows are bei
5180: 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b  ng deleted */.){
5190: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
51a0: 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61    if( pBtree->ha
51b0: 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20  sIncrblobCur==0 
51c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
51d0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
51e0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65  HoldsMutex(pBtre
51f0: 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e  e) );.  pBtree->
5200: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
5210: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72   0;.  for(p=pBtr
5220: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
5230: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
5240: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75  {.    if( (p->cu
5250: 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e  rFlags & BTCF_In
5260: 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20  crblob)!=0 ){.  
5270: 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49      pBtree->hasI
5280: 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a  ncrblobCur = 1;.
5290: 20 20 20 20 20 20 69 66 28 20 69 73 43 6c 65 61        if( isClea
52a0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
52b0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a  o.nKey==iRow ){.
52c0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
52d0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
52e0: 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
52f0: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
5300: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
5310: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
5320: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
5330: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
5340: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
5350: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  s(x,y,z).#endif 
5360: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
5370: 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
5380: 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f  * Set bit pgno o
5390: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  f the BtShared.p
53a0: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
53b0: 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  c. This is calle
53c0: 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67  d .** when a pag
53d0: 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c  e that previousl
53e0: 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61  y contained data
53f0: 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
5400: 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61  list leaf .** pa
5410: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74  ge..**.** The Bt
5420: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5430: 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73  nt bitvec exists
5440: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
5450: 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75  an obscure.** bu
5460: 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20  g caused by the 
5470: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74  interaction of t
5480: 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74  wo useful IO opt
5490: 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f  imizations surro
54a0: 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c  unding.** free-l
54b0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a  ist leaf pages:.
54c0: 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
54d0: 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  all data is dele
54e0: 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20  ted from a page 
54f0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63  and the page bec
5500: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66  omes.**      a f
5510: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
5520: 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20  ge, the page is 
5530: 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
5540: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
5550: 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73      (as free-lis
5560: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e  t leaf pages con
5570: 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66  tain no meaningf
5580: 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69  ul data). Someti
5590: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68  mes.**      such
55a0: 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65   a page is not e
55b0: 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28  ven journalled (
55c0: 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
55d0: 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20  e modified,.**  
55e0: 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a      why bother j
55f0: 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e  ournalling it?).
5600: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
5610: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
5620: 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64  f page is reused
5630: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73  , its content is
5640: 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20   not read.**    
5650: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62    from the datab
5660: 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74  ase or written t
5670: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
5680: 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69  le (why should i
5690: 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66  t.**      be, if
56a0: 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c   it is not at al
56b0: 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a  l meaningful?)..
56c0: 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c  **.** By themsel
56d0: 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d  ves, these optim
56e0: 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69  izations work fi
56f0: 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61  ne and provide a
5700: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
5710: 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62  mance boost to b
5720: 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e  ulk delete or in
5730: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  sert operations.
5740: 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20   However, if.** 
5750: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
5760: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
5770: 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64   and then reused
5780: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
5790: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  .** transaction,
57a0: 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73   a problem comes
57b0: 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65   up. If the page
57c0: 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c   is not journall
57d0: 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73  ed when.** it is
57e0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
57f0: 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69  ee-list and it i
5800: 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e  s also not journ
5810: 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a  alled when it.**
5820: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
5830: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
5840: 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65   and reused, the
5850: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  n the original d
5860: 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f  ata.** may be lo
5870: 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74  st. In the event
5880: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20   of a rollback, 
5890: 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  it may not be po
58a0: 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73  ssible.** to res
58b0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
58c0: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
58d0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l configuration.
58e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74  .**.** The solut
58f0: 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61  ion is the BtSha
5900: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
5910: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
5920: 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d   a page is .** m
5930: 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  oved to become a
5940: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
5950: 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73  page, the corres
5960: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a  ponding bit is.*
5970: 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74  * set in the bit
5980: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
5990: 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74  leaf page is ext
59a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
59b0: 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70  free-list,.** op
59c0: 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f  timization 2 abo
59d0: 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  ve is omitted if
59e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
59f0: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
5a00: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
5a10: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
5a20: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
5a30: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
5a40: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
5a50: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
5a60: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
5a70: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5a80: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
5a90: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5aa0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
5ab0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5ac0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
5ad0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  ontent ){.    as
5ae0: 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d  sert( pgno<=pBt-
5af0: 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42  >nPage );.    pB
5b00: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
5b10: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
5b20: 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29  eate(pBt->nPage)
5b30: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
5b40: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
5b50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5b60: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5b70: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
5b80: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
5b90: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
5ba0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5bb0: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
5bc0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
5bd0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
5be0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
5bf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5c00: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
5c10: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
5c20: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
5c30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5c40: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
5c50: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
5c60: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
5c70: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
5c80: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
5c90: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
5ca0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
5cb0: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
5cc0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
5cd0: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
5ce0: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
5cf0: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
5d00: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
5d10: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
5d20: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
5d30: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5d40: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
5d50: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
5d60: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
5d70: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
5d80: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
5d90: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
5da0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
5db0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5dc0: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
5dd0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
5de0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
5df0: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
5e00: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
5e10: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
5e20: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
5e30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
5e40: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
5e50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
5e60: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
5e70: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
5e80: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
5e90: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
5ea0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
5eb0: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  * Release all of
5ec0: 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61   the apPage[] pa
5ed0: 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ges for a cursor
5ee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5ef0: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5f00: 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75  CursorPages(BtCu
5f10: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
5f20: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5f30: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
5f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
5f50: 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
5f60: 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75  age[i]);.    pCu
5f70: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  r->apPage[i] = 0
5f80: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50  ;.  }.  pCur->iP
5f90: 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  age = -1;.}.../*
5fa0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
5fb0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5fc0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5fd0: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5fe0: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5ff0: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
6000: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
6010: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
6020: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
6030: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
6040: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
6050: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
6060: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
6070: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
6080: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
6090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
60a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
60b0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
60c0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
60d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
60e0: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
60f0: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
6100: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
6110: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
6120: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
6130: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
6140: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6150: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
6160: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
6170: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6180: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
6190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
61a0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
61b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
61c0: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
61d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
61e0: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
61f0: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
6200: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
6210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f  =SQLITE_OK );  /
6220: 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e  * KeySize() cann
6230: 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a  ot fail */..  /*
6240: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
6250: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
6260: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
6270: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
6280: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
6290: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
62a0: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
62b0: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
62c0: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
62d0: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
62e0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
62f0: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
6300: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
6310: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
6320: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
6330: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
6340: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
6350: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
6360: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  ta..  */.  if( 0
6370: 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
6380: 79 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  y ){.    void *p
6390: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
63a0: 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20  loc( pCur->nKey 
63b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
63c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
63d0: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
63e0: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
63f0: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
6400: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6410: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6420: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
6430: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
6440: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6450: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
6460: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6470: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6480: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6490: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
64a0: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
64b0: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
64c0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
64d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
64e0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
64f0: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
6500: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6510: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
6520: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
6530: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
6540: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
6550: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
6560: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
6570: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53   */.static int S
6580: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6590: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
65a0: 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c  (BtCursor*,Pgno,
65b0: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a  BtCursor*);../*.
65c0: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
65d0: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
65e0: 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78  sors (except pEx
65f0: 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f  cept) that are o
6600: 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61  pen on.** the ta
6610: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
6620: 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69  ge iRoot.  "Savi
6630: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ng the cursor po
6640: 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68  sition" means th
6650: 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69  at.** the locati
6660: 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20  on in the btree 
6670: 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e  is remembered in
6680: 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
6690: 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f   it can be.** mo
66a0: 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ved back to the 
66b0: 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20  same spot after 
66c0: 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65  the btree has be
66d0: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68  en modified.  Th
66e0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
66f0: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
6700: 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65  ore cursor pExce
6710: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
6720: 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c  dify the.** tabl
6730: 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69  e, for example i
6740: 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  n BtreeDelete() 
6750: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
6760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
6770: 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
6780: 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
6790: 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
67a0: 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75   all such .** cu
67b0: 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76  rsors should hav
67c0: 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c  e their BTCF_Mul
67d0: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
67e0: 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72   The btreeCursor
67f0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e  ().** routine en
6800: 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65  forces that rule
6810: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
6820: 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65  only needs to be
6830: 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68   called in.** th
6840: 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  e uncommon case 
6850: 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73  when pExpect has
6860: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
6870: 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  le flag set..**.
6880: 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e  ** If pExpect!=N
6890: 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74  ULL and if no ot
68a0: 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20  her cursors are 
68b0: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d  found on the sam
68c0: 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20  e root-page,.** 
68d0: 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75  then the BTCF_Mu
68e0: 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70  ltiple flag on p
68f0: 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65  Expect is cleare
6900: 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74  d, to avoid anot
6910: 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73  her.** pointless
6920: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
6930: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  utine..**.** Imp
6940: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
6950: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
6960: 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f  merely checks to
6970: 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73   see if any curs
6980: 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62  ors.** need to b
6990: 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c  e saved.  It cal
69a0: 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75  ls out to saveCu
69b0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e  rsorsOnList() in
69c0: 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a   the (unusual).*
69d0: 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72  * event that cur
69e0: 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64  sors are in need
69f0: 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e   to being saved.
6a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6a10: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
6a20: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
6a30: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
6a40: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
6a50: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
6a60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6a70: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6a80: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
6a90: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
6aa0: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
6ab0: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
6ac0: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
6ad0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
6ae0: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6af0: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6b00: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6b10: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
6b20: 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20   if( p ) return 
6b30: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
6b40: 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63  t(p, iRoot, pExc
6b50: 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63  ept);.  if( pExc
6b60: 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63  ept ) pExcept->c
6b70: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
6b80: 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74  _Multiple;.  ret
6b90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6ba0: 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72  ../* This helper
6bb0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65   routine to save
6bc0: 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20  AllCursors does 
6bd0: 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  the actual work 
6be0: 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65  of saving.** the
6bf0: 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20   cursors if and 
6c00: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  when a cursor is
6c10: 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75   found that actu
6c20: 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61  ally requires sa
6c30: 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d  ving..** The com
6c40: 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74  mon case is that
6c50: 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64   no cursors need
6c60: 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f   to be saved, so
6c70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6c80: 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66  .** broken out f
6c90: 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74  rom its caller t
6ca0: 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
6cb0: 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  ary stack pointe
6cc0: 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  r movement..*/.s
6cd0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6ce0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6cf0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42  rsorsOnList(.  B
6d00: 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  tCursor *p,     
6d10: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
6d20: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65   cursor that nee
6d30: 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50  ds saving */.  P
6d40: 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  gno iRoot,      
6d50: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
6d60: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
6d70: 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c  s iRoot. Save al
6d80: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
6d90: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
6da0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61      /* Do not sa
6db0: 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  ve this cursor *
6dc0: 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  /.){.  do{.    i
6dd0: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6de0: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6df0: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6e00: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
6e10: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6e20: 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
6e30: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
6e40: 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
6e50: 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72  int rc = saveCur
6e60: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
6e70: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
6e80: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
6e90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
6ea0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6ec0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50   testcase( p->iP
6ed0: 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  age>0 );.       
6ee0: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6ef0: 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a  CursorPages(p);.
6f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f10: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
6f20: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
6f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6f40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
6f50: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
6f60: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
6f70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6f80: 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42  reeClearCursor(B
6f90: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6fa0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6fb0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6fc0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
6fd0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6fe0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6ff0: 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
7000: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
7010: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  D;.}../*.** In t
7020: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
7030: 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
7040: 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
7050: 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
7060: 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
7070: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
7080: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
7090: 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
70a0: 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
70b0: 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
70c0: 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
70d0: 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74  he work..*/.stat
70e0: 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65  ic int btreeMove
70f0: 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
7100: 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
7110: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
7120: 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
7130: 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
7140: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
7150: 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
7160: 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
7170: 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
7180: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
7190: 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
71a0: 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
71b0: 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
71c0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
71d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
71e0: 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
71f0: 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
7200: 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
7210: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
7220: 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
7230: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
7260: 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
7270: 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
7280: 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
7290: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
72a0: 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20  ar aSpace[200]; 
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
72c0: 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
72d0: 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
72e0: 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72  malloc */.  char
72f0: 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
7300: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
7310: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
7320: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
7330: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
7340: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
7350: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
7360: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
7370: 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69  Info, aSpace, si
7380: 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70  zeof(aSpace), &p
7390: 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Free.    );.    
73a0: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
73b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
73c0: 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  OMEM;.    sqlite
73d0: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
73e0: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
73f0: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
7400: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
7410: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
7420: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
7430: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
7440: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
7450: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
7460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7470: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7480: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
7490: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
74a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
74b0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
74c0: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
74d0: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
74e0: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
74f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
7500: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
7510: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
7520: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7530: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
7540: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
7550: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
7560: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
7570: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
7580: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
7590: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
75a0: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
75b0: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
75c0: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
75d0: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
75e0: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
75f0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
7600: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
7610: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
7620: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
7630: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
7640: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
7650: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
7660: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7680: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
7690: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
76a0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
76b0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
76c0: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
76d0: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
76e0: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
76f0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
7700: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
7710: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
7720: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7730: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
7740: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
7750: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
7760: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7770: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
7780: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
7790: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
77a0: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
77b0: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
77c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
77e0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
77f0: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
7800: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
7810: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
7820: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
7830: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
7840: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
7850: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
7860: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
7870: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
7880: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
7890: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
78a0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
78b0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
78c0: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
78d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
78e0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
78f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7900: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
7910: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
7920: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
7930: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
7940: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7950: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
7960: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
7970: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
7980: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
7990: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
79a0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
79b0: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
79c0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
79d0: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
79e0: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
79f0: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
7a00: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
7a10: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
7a20: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
7a30: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
7a40: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
7a50: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
7a60: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
7a70: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
7a80: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
7a90: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
7aa0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
7ab0: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
7ac0: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
7ad0: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
7ae0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
7af0: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
7b00: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
7b10: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
7b20: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
7b30: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
7b40: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
7b50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7b60: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
7b70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
7b80: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
7b90: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
7ba0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
7bb0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7bc0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  D;.}../*.** This
7bd0: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
7be0: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
7bf0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
7c00: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
7c10: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
7c20: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
7c30: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
7c40: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
7c50: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
7c60: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
7c70: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
7c80: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
7c90: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
7ca0: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
7cb0: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
7cc0: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
7cd0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
7ce0: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
7cf0: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
7d00: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
7d10: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
7d20: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
7d30: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
7d40: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
7d50: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
7d60: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
7d70: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
7d80: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
7d90: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
7da0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
7db0: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
7dc0: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
7dd0: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
7de0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
7df0: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
7e00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7e10: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
7e20: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
7e30: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
7e40: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
7e50: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
7e60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7e70: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7e80: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
7e90: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7ea0: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
7eb0: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
7ec0: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7ed0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7ee0: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
7ef0: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7f00: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
7f10: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
7f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
7f30: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
7f40: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
7f50: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
7f60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7f70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
7f80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7f90: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
7fa0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
7fb0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
7fc0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
7fd0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
7fe0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
7ff0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
8000: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
8010: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
8020: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
8030: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
8040: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
8050: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
8060: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
8070: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
8080: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
8090: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
80a0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
80b0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
80c0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
80d0: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
80e0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
80f0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
8100: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
8110: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
8120: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
8130: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
8140: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
8150: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8160: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
8170: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
8180: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
8190: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
81a0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
81b0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
81c0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
81d0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
81e0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
81f0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
8200: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
8210: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
8220: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
8230: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
8240: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
8250: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
8260: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
8270: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
8280: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
8290: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
82a0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
82b0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
82c0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
82d0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
82e0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
82f0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
8300: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
8310: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
8320: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
8330: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
8340: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
8350: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
8360: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
8370: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
8380: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
8390: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
83a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
83b0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
83c0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
83d0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
83e0: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
83f0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
8400: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
8410: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
8420: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
8430: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
8440: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
8450: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
8460: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
8480: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
8490: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
84a0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
84b0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
84c0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
84d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
84e0: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
84f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
8500: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8510: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8520: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
8530: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 42 74  turn;..  if( pBt
8540: 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70  ->pMap ){.    *p
8550: 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  RC = btreePtrmap
8560: 53 74 6f 72 65 28 70 42 74 2d 3e 70 4d 61 70 2c  Store(pBt->pMap,
8570: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8580: 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
8590: 20 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72     /* The master
85a0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
85b0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
85c0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 74 72  be used as a ptr
85d0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20   map page */.   
85e0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
85f0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
8600: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
8610: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 61  (pBt)) );..    a
8620: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
8630: 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 69 66  Vacuum );.    if
8640: 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  ( key==0 ){.    
8650: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
8660: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8670: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8680: 7d 0a 20 20 20 20 69 50 74 72 6d 61 70 20 3d 20  }.    iPtrmap = 
8690: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
86a0: 74 2c 20 6b 65 79 29 3b 0a 20 20 20 20 72 63 20  t, key);.    rc 
86b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
86c0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
86d0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
86e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
86f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8700: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
8710: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8720: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 50 54  .    offset = PT
8730: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
8740: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
8750: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
8760: 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 53  {.      *pRC = S
8770: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8780: 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
8790: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
87a0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
87b0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
87c0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 20 3d  .      pPtrmap =
87d0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
87e0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
87f0: 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ge);..      if( 
8800: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
8810: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
8820: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
8830: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
8840: 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  {.        TRACE(
8850: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
8860: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
8870: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8880: 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 2a  ent));.        *
8890: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
88a0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
88b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
88c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
88d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 74  ){.          pPt
88e0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
88f0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
8900: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
8910: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
8920: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ent);.        }.
8930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8940: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8950: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
8970: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
8980: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
8990: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
89a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
89b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
89c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
89d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
89e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
89f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
8a00: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
8a10: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
8a20: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
8a30: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
8a40: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
8a50: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
8a60: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
8a70: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
8a80: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
8a90: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
8aa0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
8ab0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
8ac0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
8ad0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
8ae0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
8af0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
8b00: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8b10: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
8b20: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8b30: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8b40: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
8b50: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
8b60: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
8b70: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
8b80: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
8b90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8ba0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8bb0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
8bc0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
8bd0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
8be0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
8bf0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
8c00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
8c10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
8c20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8c30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8c40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
8c50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8c60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8c70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8c80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8c90: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
8ca0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8cb0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8cc0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8cd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8ce0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8cf0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8d00: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8d10: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8d20: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8d30: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8d40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
8d50: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
8d60: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8d70: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8d80: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8d90: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8da0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8db0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8dc0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8dd0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8df0: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8e00: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
8e10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
8e20: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
8e30: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
8e40: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
8e50: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
8e60: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
8e70: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
8e80: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
8e90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
8ea0: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8eb0: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8ec0: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8ed0: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8ee0: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8ef0: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8f00: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
8f10: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
8f20: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
8f30: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
8f40: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
8f50: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
8f60: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
8f70: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
8f80: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
8f90: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
8fa0: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8fb0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8fc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8fd0: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8fe0: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8ff0: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
9000: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
9010: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
9020: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
9030: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
9040: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
9050: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
9060: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
9070: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
9080: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
9090: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
90a0: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
90b0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
90c0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
90d0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
90e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
90f0: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
9100: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
9110: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
9120: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
9130: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
9140: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
9150: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
9160: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
9170: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
9180: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
9190: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
91a0: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
91b0: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
91c0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
91d0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
91e0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
91f0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
9200: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
9210: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9220: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9230: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9240: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9260: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9270: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
9280: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9290: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
92a0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
92b0: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
92c0: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
92d0: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
92e0: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
92f0: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
9300: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
9310: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
9320: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
9330: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
9340: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
9350: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
9360: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
9370: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
9380: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
9390: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
93a0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
93b0: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
93c0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
93d0: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
93e0: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
93f0: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
9400: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
9410: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
9420: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
9430: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
9440: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
9450: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
9460: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
9470: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
9480: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
9490: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
94a0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
94b0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
94c0: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
94d0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
94e0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
94f0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
9500: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
9510: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
9520: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
9530: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
9540: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
9550: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
9560: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
9570: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
9580: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
9590: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
95a0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
95b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
95c0: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
95d0: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
95e0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
95f0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9600: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
9610: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
9620: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
9630: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
9640: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
9650: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
9660: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
9670: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
9680: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
9690: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
96a0: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
96b0: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
96c0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  ;.  pInfo->nSize
96d0: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
96e0: 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a  low + 4;.}../*.*
96f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9700: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
9710: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
9720: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72  the MemPage.xPar
9730: 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68  seCell().** meth
9740: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20  od..**.** Parse 
9750: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
9760: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
9770: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
9780: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62  ructure..**.** b
9790: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
97a0: 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  ()        =>   t
97b0: 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20  able btree leaf 
97c0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
97d0: 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64  rseCellNoPayload
97e0: 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62  ()  =>   table b
97f0: 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  tree internal no
9800: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
9810: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
9820: 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72    =>   index btr
9830: 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54  ee nodes.**.** T
9840: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77  here is also a w
9850: 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
9860: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
9870: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
9880: 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74  ** all MemPage t
9890: 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65  ypes and that re
98a0: 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c  ferences the cel
98b0: 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65  l by index rathe
98c0: 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69  r than.** by poi
98d0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
98e0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
98f0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  ellPtrNoPayload(
9900: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9910: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9920: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
9930: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
9940: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9950: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9960: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9970: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9980: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9990: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
99a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
99b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
99c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
99d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
99e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
99f0: 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61  ->leaf==0 );.  a
9a00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f  ssert( pPage->no
9a10: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73  Payload );.  ass
9a20: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9a30: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
9a40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
9a50: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
9a60: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
9a70: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
9a80: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
9a90: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
9aa0: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
9ab0: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
9ac0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
9ad0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
9ae0: 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66  .  pInfo->iOverf
9af0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  low = 0;.  pInfo
9b00: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
9b10: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
9b20: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9b30: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
9b40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9b50: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9b60: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9b70: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9ba0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9bb0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9bc0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9bd0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9be0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9bf0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9c00: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9c10: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
9c20: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
9c30: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
9c40: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9c50: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
9c60: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c80: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
9c90: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
9ca0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9cb0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9cc0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9cd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9ce0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
9cf0: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
9d00: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
9d10: 4c 65 61 66 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  Leaf || pPage->n
9d20: 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73  oPayload );.  as
9d30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50  sert( pPage->noP
9d40: 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 61  ayload==0 );.  a
9d50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9d60: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9d70: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9d80: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9d90: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9da0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9db0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9dc0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9dd0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9de0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9df0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9e00: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9e10: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9e20: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9e30: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9e40: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9e50: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9e60: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9e70: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9e80: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9e90: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9ea0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9eb0: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9ec0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9ed0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9ee0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9ef0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9f00: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9f10: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9f20: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9f30: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9f40: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9f50: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9f60: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9f70: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9f80: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9f90: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9fa0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9fb0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9fc0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9fd0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9fe0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ff0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
a000: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
a010: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
a020: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
a030: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a040: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
a050: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
a060: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
a070: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
a090: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
a0a0: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
a0b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a0c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
a0d0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
a0e0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
a0f0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
a100: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
a110: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a120: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a130: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a140: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a150: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a160: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a170: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a180: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a190: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a1a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a1b0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a1c0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a1d0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a1e0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a1f0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a200: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a210: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a220: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a230: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a240: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a250: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a260: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a270: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a280: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a290: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a2a0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
a2b0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
a2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
a2d0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
a2e0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
a2f0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
a300: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
a310: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
a320: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a  seCellPtrIndex(.
a330: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
a340: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
a350: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
a360: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
a370: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
a380: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
a390: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
a3a0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a3b0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a3c0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a3d0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
a3e0: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
a3f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
a400: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
a410: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
a420: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
a430: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
a440: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
a450: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
a460: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a470: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a480: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a490: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
a4a0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
a4b0: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eaf==1 );.  asse
a4c0: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
a4d0: 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73  yLeaf==0 );.  as
a4e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50  sert( pPage->noP
a4f0: 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 70  ayload==0 );.  p
a500: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a510: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a520: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
a530: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a540: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
a550: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
a560: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
a570: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
a580: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
a590: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
a5a0: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
a5b0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a5c0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a5d0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a5e0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a5f0: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
a600: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
a610: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
a620: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
a630: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
a640: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
a650: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
a660: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a670: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
a680: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
a690: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a6a0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
a6b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a6c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
a6d0: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
a6e0: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
a6f0: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
a700: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
a710: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
a720: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
a730: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
a740: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
a750: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
a760: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a770: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
a780: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
a790: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
a7a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
a7b0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
a7c0: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
a7d0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
a7e0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
a7f0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
a800: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
a810: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
a820: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
a830: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
a840: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
a850: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a860: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a870: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a880: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
a890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a8a0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
a8b0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
a8c0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
a8d0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
a8e0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
a8f0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ure */.){.  pPag
a900: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a910: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
a920: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
a930: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  fo);.}../*.** Th
a940: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a950: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
a960: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
a970: 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a  MemPage.xCellSiz
a980: 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  e.** method..**.
a990: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
a9a0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
a9b0: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
a9c0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
a9d0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
a9e0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
a9f0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
aa00: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
aa10: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
aa20: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
aa30: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
aa40: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
aa50: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
aa60: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
aa70: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
aa80: 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  ..**.** cellSize
aa90: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  PtrNoPayload()  
aaa0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74    =>   table int
aab0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63  ernal nodes.** c
aac0: 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20  ellSizePtr()    
aad0: 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c           =>   al
aae0: 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20  l index nodes & 
aaf0: 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73  table leaf nodes
ab00: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
ab10: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
ab20: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
ab30: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
ab40: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61  er = pCell + pPa
ab50: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
ab60: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
ab70: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
ab80: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
ab90: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
abc0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  or a varint */. 
abd0: 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20   u32 nSize;     
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ac00: 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  e value to retur
ac10: 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  n */..#ifdef SQL
ac20: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
ac30: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
ac40: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
ac50: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
ac60: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
ac70: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
ac80: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
ac90: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
aca0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
acb0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
acc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
acd0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
ace0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
acf0: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
ad00: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
ad10: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
ad20: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
ad30: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
ad40: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
ad50: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
ad60: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
ad70: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
ad80: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
ad90: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
ada0: 61 64 3d 3d 30 20 29 3b 0a 20 20 6e 53 69 7a 65  ad==0 );.  nSize
adb0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
adc0: 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a   nSize>=0x80 ){.
add0: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
ade0: 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20  r[8];.    nSize 
adf0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
ae00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  .      nSize = (
ae10: 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b  nSize<<7) | (*++
ae20: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
ae30: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
ae40: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
ae50: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
ae60: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20   pIter++;.  if( 
ae70: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
ae80: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
ae90: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
aea0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
aeb0: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
aec0: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
aed0: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
aee0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
aef0: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
af00: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
af10: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
af20: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
af30: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
af40: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
af50: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
af60: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
af70: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
af80: 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
af90: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
afa0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
afb0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
afc0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
afd0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
afe0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
aff0: 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b  l ){.    nSize +
b000: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
b010: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
b020: 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20  nSize<4 ) nSize 
b030: 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 4;.  }else{.  
b040: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
b050: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
b060: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
b070: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
b080: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
b090: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b0a0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
b0b0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
b0c0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
b0d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b0e0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
b0f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
b100: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
b110: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
b120: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
b130: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
b140: 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75   nSize += 4 + (u
b150: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
b160: 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  l);.  }.  assert
b170: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
b180: 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52  fo.nSize || CORR
b190: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b1a0: 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d  rn (u16)nSize;.}
b1b0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
b1c0: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
b1d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b1e0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
b1f0: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
b200: 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f   + 4; /* For loo
b210: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
b220: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
b230: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
b240: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
b250: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
b260: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b270: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
b280: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b290: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
b2a0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
b2b0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
b2c0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
b2d0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
b2e0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
b2f0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
b300: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
b310: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
b320: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
b330: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
b340: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
b350: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
b360: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
b370: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
b380: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
b390: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
b3a0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
b3b0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
b3c0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73  debuginfo);.#els
b3d0: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
b3e0: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
b3f0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
b400: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
b410: 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20  ze==4 );.  pEnd 
b420: 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77  = pIter + 9;.  w
b430: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
b440: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
b450: 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  End );.  assert(
b460: 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65   debuginfo.nSize
b470: 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  ==(u16)(pIter - 
b480: 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
b490: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
b4a0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
b4b0: 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65  Cell);.}...#ifde
b4c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
b4d0: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
b4e0: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
b4f0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
b500: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
b510: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
b520: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
b530: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
b540: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
b550: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  l){.  return pPa
b560: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b570: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
b580: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
b590: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b5a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b5b0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
b5c0: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
b5d0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
b5e0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
b5f0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
b600: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
b610: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
b620: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
b630: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
b640: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
b650: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
b660: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
b670: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
b680: 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43  *pCell, int *pRC
b690: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
b6a0: 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29  fo;.  if( *pRC )
b6b0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b6c0: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
b6d0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b6e0: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b6f0: 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
b700: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
b710: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
b720: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
b730: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
b740: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
b750: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
b760: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
b770: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
b780: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
b790: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
b7a0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
b7b0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
b7c0: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
b7d0: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
b7e0: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
b7f0: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
b800: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
b810: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
b820: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
b830: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
b840: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
b850: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
b860: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b870: 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44  area..**.** EVID
b880: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32  ENCE-OF: R-44582
b890: 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61  -60138 SQLite ma
b8a0: 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74  y from time to t
b8b0: 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61  ime reorganize a
b8c0: 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20  .** b-tree page 
b8d0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
b8e0: 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20  e no freeblocks 
b8f0: 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65  or fragment byte
b900: 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64  s, all.** unused
b910: 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61   bytes are conta
b920: 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c  ined in the unal
b930: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65  located space re
b940: 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a  gion, and all.**
b950: 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65   cells are packe
b960: 64 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65  d tightly at the
b970: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b990: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
b9a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b9b0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b9e0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba00: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
ba10: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
ba20: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
ba30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
ba40: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
ba50: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
ba60: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
ba70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ba80: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
ba90: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
baa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bab0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
bac0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
bad0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
baf0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
bb00: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
bb10: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
bb40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
bb50: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
bb60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
bb70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bb80: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
bb90: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
bba0: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
bbb0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
bbc0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
bbd0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
bbe0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
bbf0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
bc00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
bc10: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
bc20: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
bc30: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
bc40: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
bc50: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
bc60: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
bc70: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
bc80: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
bc90: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
bca0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
bcb0: 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73  */...  assert( s
bcc0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bcd0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bce0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bcf0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bd00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bd10: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bd20: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bd30: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bd40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd50: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bd80: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bd90: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bda0: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bdb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
bdc0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
bdd0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
bde0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
bdf0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
be00: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
be10: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
be20: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
be30: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
be40: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
be50: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
be60: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  ze;.  cbrk = usa
be70: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
be80: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
be90: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
bea0: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
beb0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
bec0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
bed0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
bee0: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
bef0: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
bf00: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
bf10: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
bf20: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
bf30: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
bf40: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
bf50: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
bf60: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
bf70: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
bf80: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  );.    /* These 
bf90: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
bfa0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
bfb0: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
bfc0: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
bfd0: 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73  if PRAGMA cell_s
bfe0: 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20  ize_check=ON..  
bff0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
c000: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c010: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c020: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c030: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c040: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
c050: 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc>=iCellFirst
c060: 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73   && pc<=iCellLas
c070: 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  t );.    size = 
c080: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
c090: 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d  (pPage, &src[pc]
c0a0: 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73  );.    cbrk -= s
c0b0: 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72  ize;.    if( cbr
c0c0: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  k<iCellFirst || 
c0d0: 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69  pc+size>usableSi
c0e0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
c0f0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c100: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
c110: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
c120: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
c130: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
c140: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
c150: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
c160: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c170: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
c180: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c190: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
c1a0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
c1b0: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
c1c0: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
c1d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
c1e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c1f0: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
c200: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
c210: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
c220: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
c230: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c240: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
c250: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
c260: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
c270: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
c280: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
c290: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
c2a0: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
c2b0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
c2c0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
c2d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
c2e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
c2f0: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
c300: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
c310: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
c320: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
c330: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c340: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c350: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c360: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c370: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c380: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c390: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
c3a0: 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ( cbrk-iCellFirs
c3b0: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
c3c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c3e0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
c3f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c400: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66  .** Search the f
c410: 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65  ree-list on page
c420: 20 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74   pPg for space t
c430: 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e  o store a cell n
c440: 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a  Byte bytes in.**
c450: 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61   size. If one ca
c460: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
c470: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
c480: 74 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65  the space and re
c490: 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20  move it.** from 
c4a0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
c4b0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  *.** If no suita
c4c0: 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65  ble space can be
c4d0: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72   found on the fr
c4e0: 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20  ee-list, return 
c4f0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
c500: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65   function may de
c510: 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20  tect corruption 
c520: 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20  within pPg.  If 
c530: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a  corruption is.**
c540: 20 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a   detected then *
c550: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51  pRc is set to SQ
c560: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
c570: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
c580: 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f  d..**.** Slots o
c590: 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  n the free list 
c5a0: 74 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e  that are between
c5b0: 20 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c   1 and 3 bytes l
c5c0: 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65  arger than nByte
c5d0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  .** will be igno
c5e0: 72 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68  red if adding th
c5f0: 65 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f  e extra space to
c600: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69   the fragmentati
c610: 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73  on count.** caus
c620: 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  es the fragmenta
c630: 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78  tion count to ex
c640: 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74  ceed 60..*/.stat
c650: 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53  ic u8 *pageFindS
c660: 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67  lot(MemPage *pPg
c670: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
c680: 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20   *pRc){.  const 
c690: 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
c6a0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  drOffset;.  u8 *
c6b0: 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
c6c0: 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74  Pg->aData;.  int
c6d0: 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31   iAddr = hdr + 1
c6e0: 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74  ;.  int pc = get
c6f0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64  2byte(&aData[iAd
c700: 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20  dr]);.  int x;. 
c710: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
c720: 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
c730: 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  leSize;..  asser
c740: 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b  t( pc>0 );.  do{
c750: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
c760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c770: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
c780: 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49  ot */.    /* EVI
c790: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36  DENCE-OF: R-0686
c7a0: 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63  6-39125 Freebloc
c7b0: 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f  ks are always co
c7c0: 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72  nnected in order
c7d0: 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65   of.    ** incre
c7e0: 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f  asing offset. */
c7f0: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
c800: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69  leSize-4 || pc<i
c810: 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  Addr+4 ){.      
c820: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
c830: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c840: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c850: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
c860: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
c870: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
c880: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
c890: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
c8a0: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
c8b0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
c8c0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
c8d0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
c8e0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
c8f0: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
c900: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
c910: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
c920: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
c930: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
c940: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
c950: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
c960: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
c970: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c980: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
c990: 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65  if( pc < pPg->ce
c9a0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e  llOffset+2*pPg->
c9b0: 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63  nCell || size+pc
c9c0: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
c9d0: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
c9e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c9f0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  KPT;.        ret
ca00: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
ca10: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
ca20: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
ca30: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
ca40: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
ca50: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
ca60: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
ca70: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
ca80: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
ca90: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
caa0: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
cab0: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
cac0: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
cad0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
cae0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
caf0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
cb00: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
cb10: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
cb20: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
cb30: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
cb40: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
cb50: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
cb60: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
cb70: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
cb80: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
cb90: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )x;.      }else{
cba0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cbb0: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
cbc0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
cbd0: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
cbe0: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
cbf0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
cc00: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
cc10: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
cc20: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
cc30: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
cc40: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
cc50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
cc60: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
cc70: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
cc80: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
cc90: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
cca0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29  ;.  }while( pc )
ccb0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ;..  return 0;.}
ccc0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
ccd0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
cce0: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
ccf0: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
cd00: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
cd10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
cd20: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
cd30: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
cd40: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
cd50: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
cd60: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
cd70: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
cd80: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
cd90: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
cda0: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
cdb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
cdc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
cdd0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
cde0: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
cdf0: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
ce00: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
ce10: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
ce20: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
ce30: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
ce40: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
ce50: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
ce60: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
ce70: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
ce80: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
ce90: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
cea0: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
ceb0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
cec0: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
ced0: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
cee0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
cef0: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
cf00: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
cf10: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
cf20: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
cf30: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
cf40: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
cf50: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
cf60: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
cf70: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
cf80: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
cf90: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
cfa0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
cfb0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
cfc0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
cfd0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
cfe0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
cff0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d000: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d010: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d020: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d050: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d060: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d070: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d080: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d0a0: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
d0b0: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
d0c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d0d0: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
d0e0: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
d0f0: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
d100: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
d110: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
d120: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
d130: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d140: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
d150: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d160: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d170: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d180: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d190: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
d1a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
d1b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
d1c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
d1d0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
d1e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d1f0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d200: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
d210: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
d220: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
d230: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
d240: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d250: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
d260: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
d270: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
d280: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
d290: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
d2a0: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
d2b0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
d2c0: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
d2d0: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
d2e0: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
d2f0: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
d300: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
d310: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
d320: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
d330: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
d340: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
d350: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d360: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
d370: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
d380: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
d390: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
d3a0: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
d3b0: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
d3c0: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
d3d0: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
d3e0: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
d3f0: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
d400: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
d410: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
d420: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d430: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
d440: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
d450: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
d460: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
d470: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
d480: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
d490: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
d4a0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d4b0: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
d4c0: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
d4d0: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
d4e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d4f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d510: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e  * If there is en
d520: 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65  ough space betwe
d530: 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66  en gap and top f
d540: 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c  or one more cell
d550: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72   pointer.  ** ar
d560: 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74  ray entry offset
d570: 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65  , and if the fre
d580: 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70  elist is not emp
d590: 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20  ty, then search 
d5a0: 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73  the.  ** freelis
d5b0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
d5c0: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
d5d0: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
d5e0: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a  the request..  *
d5f0: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
d600: 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+2==top );.  te
d610: 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74  stcase( gap+1==t
d620: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
d630: 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20  ( gap==top );.  
d640: 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d  if( (data[hdr+2]
d650: 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29   || data[hdr+1])
d660: 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29   && gap+2<=top )
d670: 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65  {.    u8 *pSpace
d680: 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
d690: 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72  pPage, nByte, &r
d6a0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61  c);.    if( pSpa
d6b0: 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ce ){.      asse
d6c0: 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61  rt( pSpace>=data
d6d0: 20 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61   && (pSpace - da
d6e0: 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
d6f0: 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29     *pIdx = (int)
d700: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b  (pSpace - data);
d710: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d720: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
d730: 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  se if( rc ){.   
d740: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d750: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d760: 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20  e request could 
d770: 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64  not be fulfilled
d780: 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73   using a freelis
d790: 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20  t slot.  Check. 
d7a0: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65   ** to see if de
d7b0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73  fragmentation is
d7c0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
d7d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d7e0: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
d7f0: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
d800: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73  te>top ){.    as
d810: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
d820: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
d830: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
d840: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
d850: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
d860: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d870: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
d880: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
d890: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
d8a0: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
d8b0: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
d8c0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
d8d0: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
d8e0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
d8f0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
d900: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
d910: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
d920: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
d930: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
d940: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
d950: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
d960: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
d970: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
d980: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
d990: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
d9a0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
d9b0: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
d9c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
d9d0: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
d9e0: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
d9f0: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
da00: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
da10: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
da20: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
da30: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
da40: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
da50: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
da60: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
da70: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
da80: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
da90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
daa0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
dab0: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
dac0: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
dad0: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
dae0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
daf0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
db00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
db10: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
db20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
db30: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
db40: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
db50: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
db60: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
db70: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
db80: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
db90: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
dba0: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
dbb0: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
dbc0: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
dbd0: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
dbe0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
dbf0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
dc00: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
dc10: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
dc20: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
dc30: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
dc40: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
dc50: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
dc60: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
dc70: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
dc80: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
dc90: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
dca0: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
dcb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dcc0: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
dcd0: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
dce0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
dcf0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
dd00: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
dd10: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
dd20: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
dd50: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
dd60: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
dd70: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dda0: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
ddb0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dde0: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
ddf0: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
de00: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
de30: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
de40: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
de50: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
de60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
de70: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
de80: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
de90: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
dea0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
deb0: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
dec0: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
ded0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
dee0: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
def0: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
df00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
df10: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
df20: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
df30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
df40: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
df50: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
df60: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
df70: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
df80: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
df90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
dfa0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
dfb0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
dfc0: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
dfd0: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
dfe0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
dff0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e000: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
e010: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
e020: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
e030: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
e040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
e060: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
e070: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
e080: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
e090: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
e0a0: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
e0b0: 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20  ( iStart<=iLast 
e0c0: 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  );..  /* Overwri
e0d0: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
e0e0: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
e0f0: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
e100: 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70  e_delete.  ** op
e110: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
e120: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
e130: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
e140: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
e150: 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
e160: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30  &data[iStart], 0
e170: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , iSize);.  }.. 
e180: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
e190: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
e1a0: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
e1b0: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
e1c0: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
e1d0: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
e1e0: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
e1f0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
e200: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
e210: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
e220: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
e230: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
e240: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
e250: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
e260: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
e270: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
e280: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
e290: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
e2a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
e2b0: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
e2c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e2d0: 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42  r]))>0 && iFreeB
e2e0: 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  lk<iStart ){.   
e2f0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
e300: 69 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20  iPtr+4 ) return 
e310: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
e320: 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20  KPT;.      iPtr 
e330: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
e340: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
e350: 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72  lk>iLast ) retur
e360: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e370: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
e380: 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72  t( iFreeBlk>iPtr
e390: 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20   || iFreeBlk==0 
e3a0: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20  );.  .    /* At 
e3b0: 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20  this point:.    
e3c0: 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20  **    iFreeBlk: 
e3d0: 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63    First freebloc
e3e0: 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20  k after iStart, 
e3f0: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a  or zero if none.
e400: 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20      **    iPtr: 
e410: 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73        The addres
e420: 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74  s of a pointer t
e430: 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  o iFreeBlk.    *
e440: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
e450: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
e460: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
e470: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
e480: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
e490: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
e4a0: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
e4b0: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
e4c0: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
e4d0: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
e4e0: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
e4f0: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
e500: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e510: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69  ;.      iEnd = i
e520: 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79  FreeBlk + get2by
e530: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
e540: 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  k+2]);.      if(
e550: 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70   iEnd > pPage->p
e560: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
e570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e580: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e590: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
e5a0: 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  - iStart;.      
e5b0: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
e5c0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
e5d0: 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  lk]);.    }.  . 
e5e0: 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73     /* If iPtr is
e5f0: 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f   another freeblo
e600: 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20  ck (that is, if 
e610: 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20  iPtr is not the 
e620: 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20  freelist.    ** 
e630: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70  pointer in the p
e640: 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e  age header) then
e650: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
e660: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
e670: 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63  e.    ** coalesc
e680: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
e690: 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a  of iPtr..    */.
e6a0: 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64 72      if( iPtr>hdr
e6b0: 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  +1 ){.      int 
e6c0: 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b  iPtrEnd = iPtr +
e6d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e6e0: 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20  iPtr+2]);.      
e6f0: 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69  if( iPtrEnd+3>=i
e700: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
e710: 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74   if( iPtrEnd>iSt
e720: 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  art ) return SQL
e730: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e740: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
e750: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
e760: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
e770: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
e780: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
e790: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
e7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
e7b0: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
e7c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e7d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e7e0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d     data[hdr+7] -
e7f0: 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69  = nFrag;.  }.  i
e800: 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62  f( iStart==get2b
e810: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
e820: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
e830: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73  new freeblock is
e840: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
e850: 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  g of the cell co
e860: 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20  ntent area,.    
e870: 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e  ** so just exten
e880: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
e890: 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74  nt area rather t
e8a0: 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68  han create anoth
e8b0: 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69  er.    ** freeli
e8c0: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  st entry */.    
e8d0: 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20  if( iPtr!=hdr+1 
e8e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e8f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
e900: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e910: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
e920: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
e930: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
e940: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
e950: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
e960: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
e970: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
e980: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
e990: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
e9a0: 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62  tart);.    put2b
e9b0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
e9c0: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
e9d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e9e0: 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a  [iStart+2], iSiz
e9f0: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
ea00: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
ea10: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
ea20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ea30: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
ea40: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
ea50: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
ea60: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
ea70: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
ea80: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
ea90: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
eaa0: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
eab0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
eac0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
ead0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
eae0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
eaf0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
eb00: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
eb10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
eb20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
eb30: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
eb40: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
eb50: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
eb60: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
eb70: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
eb80: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
eb90: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eba0: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
ebb0: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
ebc0: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
ebd0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ebe0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
ebf0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
ec00: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
ec10: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
ec20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
ec30: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
ec40: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
ec50: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
ec60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ec70: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
ec80: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
ec90: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
eca0: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
ecb0: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
ecc0: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
ecd0: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
ece0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
ecf0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
ed00: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
ed10: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
ed20: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
ed30: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
ed40: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
ed50: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
ed60: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
ed70: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
ed80: 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33  E-OF: R-03640-13
ed90: 34 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35  415 A value of 5
eda0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
edb0: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
edc0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72     ** table b-tr
edd0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
ede0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
edf0: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
ee00: 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==5 );.    /* E
ee10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30  VIDENCE-OF: R-20
ee20: 35 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75  501-61796 A valu
ee30: 65 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68  e of 13 means th
ee40: 65 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66  e page is a leaf
ee50: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d  .    ** table b-
ee60: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
ee70: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
ee80: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
ee90: 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33  EY|PTF_LEAF)==13
eea0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
eeb0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69  ntKey = 1;.    i
eec0: 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
eed0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
eee0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20  ntKeyLeaf = 1;. 
eef0: 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61       pPage->noPa
ef00: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 20  yload = 0;.     
ef10: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
ef20: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
ef30: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
ef40: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
ef50: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
ef60: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50        pPage->noP
ef70: 61 79 6c 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20  ayload = 1;.    
ef80: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
ef90: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
efa0: 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20  NoPayload;.     
efb0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
efc0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
efd0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  ellPtrNoPayload;
efe0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
eff0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
f000: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
f010: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
f020: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
f030: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
f040: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
f050: 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  A ){.    /* EVID
f060: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35  ENCE-OF: R-27225
f070: 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f  -53936 A value o
f080: 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61  f 2 means the pa
f090: 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f  ge is an interio
f0a0: 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62  r.    ** index b
f0b0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f0c0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f0d0: 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a  ZERODATA)==2 );.
f0e0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f0f0: 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31  OF: R-16571-1161
f100: 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20  5 A value of 10 
f110: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f120: 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20  s a leaf.    ** 
f130: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
f140: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f150: 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c  ( (PTF_ZERODATA|
f160: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b  PTF_LEAF)==10 );
f170: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
f180: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
f190: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
f1a0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  0;.    pPage->no
f1b0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
f1c0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f1d0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f1e0: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
f1f0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f200: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
f210: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
f220: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
f230: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
f240: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f250: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
f260: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
f270: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
f280: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
f290: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
f2a0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f2b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
f2c0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
f2d0: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
f2e0: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
f2f0: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
f300: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f310: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
f320: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
f330: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
f340: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
f350: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f360: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
f370: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
f380: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
f390: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
f3a0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
f3b0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
f3c0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
f3d0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
f3e0: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
f3f0: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
f400: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
f410: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
f420: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
f430: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
f440: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
f450: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
f460: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
f470: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
f480: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f490: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
f4a0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
f4b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f4c0: 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
f4d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f4e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f4f0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
f510: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
f520: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
f530: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
f540: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f550: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
f560: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
f570: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
f580: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f590: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
f5a0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
f5b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
f5c0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
f5d0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
f5e0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
f5f0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
f600: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
f610: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
f620: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
f630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f640: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
f650: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
f660: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
f670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
f680: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
f690: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
f6a0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
f6b0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
f6c0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
f6d0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
f6e0: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
f6f0: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
f700: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
f710: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
f720: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
f730: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
f740: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
f750: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
f760: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
f770: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f780: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
f790: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
f7a0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
f7b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
f7c0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
f7d0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
f7e0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
f7f0: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
f800: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
f810: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
f820: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
f830: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
f840: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
f850: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
f860: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
f870: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
f880: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
f890: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
f8a0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
f8b0: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ata;.    /* EVID
f8c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
f8d0: 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
f8e0: 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
f8f0: 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
f900: 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
f910: 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
f920: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
f930: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
f940: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
f950: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f960: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
f970: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
f980: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
f990: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
f9a0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
f9b0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
f9c0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
f9d0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
f9e0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
f9f0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
fa00: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
fa10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
fa20: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
fa30: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
fa40: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
fa50: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
fa60: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
fa70: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
fa80: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
fa90: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
faa0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
fab0: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
fac0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
fad0: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
fae0: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
faf0: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
fb00: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
fb10: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
fb20: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
fb30: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
fb40: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
fb50: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
fb60: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
fb70: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
fb80: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
fb90: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
fba0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
fbb0: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
fbc0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
fbd0: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
fbe0: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
fbf0: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
fc00: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
fc10: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
fc20: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
fc30: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
fc40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
fc50: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
fc60: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
fc70: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
fc80: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
fc90: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
fca0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
fcb0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
fcc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
fcd0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
fce0: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
fcf0: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
fd00: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
fd10: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
fd20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
fd30: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
fd40: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
fd50: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
fd60: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
fd70: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
fd80: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
fd90: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
fda0: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
fdb0: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
fdc0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
fdd0: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
fde0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
fdf0: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
fe00: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
fe10: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
fe20: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
fe30: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
fe40: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
fe50: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
fe60: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
fe70: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
fe80: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
fe90: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
fea0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
feb0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
fec0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
fed0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
fee0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
fef0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
ff00: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
ff10: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
ff20: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
ff30: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
ff40: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
ff50: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
ff60: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
ff70: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
ff80: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
ff90: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
ffa0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
ffb0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
ffc0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
ffd0: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
ffe0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
fff0: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
10000 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
10010 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
10020 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
10030 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
10040 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
10050 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
10060 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
10070 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
10080 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
10090 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
100a0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
100b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
100c0 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
100d0 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
100e0 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
100f0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10100 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
10110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10120 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
10130 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
10140 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
10150 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
10160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10170 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10180 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
10190 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65        sz = pPage
101a0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
101b0 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
101c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
101d0 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
101e0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
101f0 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
10200 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
10210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10220 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10230 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10240 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
10250 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
10260 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20  ++;.    }  ..   
10270 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10280 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
10290 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
102a0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
102b0 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
102c0 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
102d0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
102e0 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
102f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
10300 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
10310 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
10320 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
10330 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
10340 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
10350 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
10360 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
10370 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
10380 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
10390 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
103a0 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
103b0 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68   space */.    wh
103c0 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
103d0 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
103e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
103f0 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
10400 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
10410 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
10420 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
10430 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
10440 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
10450 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
10460 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
10470 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
10480 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
10490 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
104a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
104b0 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72     ** Or, the fr
104c0 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  eeblock is off t
104d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
104e0 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ge.        */.  
104f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10500 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10510 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
10520 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
10530 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
10540 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
10550 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
10560 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74  .      if( (next
10570 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
10580 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a  ize+3) || pc+siz
10590 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
105a0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
105b0 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
105c0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
105d0 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20  r. And the last 
105e0 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20  byte of.        
105f0 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  ** the free-bloc
10600 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68  k must lie on th
10610 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  e database page.
10620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
10630 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10640 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
10650 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
10660 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
10670 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
10680 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
10690 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
106a0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
106b0 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
106c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
106d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
106e0 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
106f0 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
10700 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
10710 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
10720 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
10730 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
10740 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
10750 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
10760 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10770 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10780 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10790 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
107a0 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
107b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
107c0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
107d0 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
107e0 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
107f0 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
10800 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
10810 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
10820 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
10830 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
10840 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10860 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
10870 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
10880 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
10890 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
108a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
108b0 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
108c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
108d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
108e0 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
108f0 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
10900 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
10910 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
10920 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
10930 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
10940 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
10950 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
10960 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
10970 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
10980 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
10990 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
109a0 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
109b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
109c0 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
109d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
109e0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
109f0 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
10a00 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
10a10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
10a20 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
10a30 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
10a40 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
10a50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10a60 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
10a70 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
10a80 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
10a90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
10aa0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
10ab0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10ac0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10ad0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10ae0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
10af0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
10b00 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
10b10 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10b20 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10b30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10b40 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10b50 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10b60 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10b70 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
10b80 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
10b90 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
10ba0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
10bb0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
10bc0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
10bd0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10be0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
10bf0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
10c00 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
10c10 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
10c20 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
10c30 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
10c40 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
10c50 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
10c60 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10c70 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
10c80 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
10c90 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
10ca0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
10cb0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
10cc0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
10cd0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
10ce0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
10cf0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
10d00 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
10d10 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
10d20 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
10d30 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
10d40 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
10d50 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
10d60 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
10d70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
10d80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
10d90 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
10da0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
10db0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
10dc0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
10dd0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
10de0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10df0 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
10e00 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
10e10 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
10e20 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
10e30 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10e40 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
10e50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10e60 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
10e70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
10e80 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
10e90 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
10ea0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
10eb0 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
10ec0 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
10ed0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
10ee0 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
10ef0 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31  Offset = pgno==1
10f00 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
10f10 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
10f20 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
10f30 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
10f40 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
10f50 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
10f60 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
10f70 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10f80 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
10f90 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
10fa0 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
10fb0 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
10fc0 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
10fd0 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
10fe0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
10ff0 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
11000 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
11010 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
11020 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
11030 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
11040 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
11050 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
11060 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
11070 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
11080 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
11090 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
110a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
110b0 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
110c0 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
110d0 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
110e0 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
110f0 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
11100 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
11110 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
11120 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
11130 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
11140 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
11150 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
11160 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
11170 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
11180 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11190 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
111a0 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
111b0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
111c0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
111d0 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
111e0 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
111f0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
11200 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
11210 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
11220 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
11230 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
11240 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
11250 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
11260 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
11270 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
11280 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
11290 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
112a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
112b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
112c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
112d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
112e0 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
112f0 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
11300 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
11310 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
11320 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
11330 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
11340 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
11350 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
11360 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11370 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
11380 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
11390 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
113a0 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
113b0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
113c0 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
113d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
113e0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
113f0 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
11400 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
11410 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
11420 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
11430 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
11440 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
11450 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
11460 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
11470 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
11480 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11490 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
114a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
114b0 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
114c0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
114d0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
114e0 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
114f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
11500 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11510 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11520 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
11530 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
11540 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
11550 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11560 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
11570 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
11580 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
11590 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
115a0 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
115b0 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
115c0 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
115d0 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
115e0 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
115f0 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
11600 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
11610 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
11620 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
11630 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
11640 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
11650 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
11660 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11670 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11680 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 23 69 66 64 65  ->pBt);.}..#ifde
11690 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
116a0 55 4e 4c 4f 43 4b 45 44 0a 2f 2a 0a 2a 2a 20 54  UNLOCKED./*.** T
116b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
116c0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 6c  called before al
116d0 6c 6f 63 61 74 69 6e 67 20 6f 72 20 66 72 65 65  locating or free
116e0 69 6e 67 20 61 20 62 2d 74 72 65 65 20 70 61 67  ing a b-tree pag
116f0 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 63 75 72  e. If.** the cur
11700 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
11710 20 69 73 20 55 4e 4c 4f 43 4b 45 44 2c 20 69 74   is UNLOCKED, it
11720 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 42   allocates the B
11730 74 72 65 65 50 74 72 6d 61 70 20 0a 2a 2a 20 73  treePtrmap .** s
11740 74 72 75 63 74 75 72 65 20 61 6e 64 20 7a 65 72  tructure and zer
11750 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
11760 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
11770 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
11780 65 72 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2e  er.** on page 1.
11790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
117a0 6c 6c 6f 63 61 74 65 50 74 72 6d 61 70 28 42 74  llocatePtrmap(Bt
117b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
117c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
117d0 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  OK;.  if( pBt->p
117e0 4d 61 70 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  Map==0 && sqlite
117f0 33 50 61 67 65 72 49 73 55 6e 6c 6f 63 6b 65 64  3PagerIsUnlocked
11800 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
11810 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
11820 69 73 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 74  is an unlocked t
11830 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 65 74 20  ransaction, set 
11840 74 68 65 20 68 65 61 64 65 72 20 76 61 6c 75 65  the header value
11850 73 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 66  s.    ** identif
11860 79 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ying the size of
11870 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
11880 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
11890 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
118a0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
118b0 65 20 74 6f 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  e to zero. */.  
118c0 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
118d0 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Map = sqlite3_ma
118e0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72 65  lloc(sizeof(Btre
118f0 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 69  ePtrmap));.    i
11900 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20  f( pMap==0 ){.  
11910 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11920 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
11930 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
11940 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
11950 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a 65 6f  ta[32], 0, sizeo
11960 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20 20 20  f(u32)*2);.     
11970 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20 30 2c   memset(pMap, 0,
11980 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74 72   sizeof(BtreePtr
11990 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70 4d 61  map));.      pMa
119a0 70 2d 3e 69 46 69 72 73 74 20 3d 20 62 74 72 65  p->iFirst = btre
119b0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
119c0 2b 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  + 1;.      pBt->
119d0 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20  pMap = pMap;.   
119e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
119f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
11a00 65 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  e a pointer-map 
11a10 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 6c 6c  allocated by all
11a20 6f 63 61 74 65 50 74 72 6d 61 70 2e 0a 2a 2f 0a  ocatePtrmap..*/.
11a30 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 6c 65  static void dele
11a40 74 65 50 74 72 6d 61 70 28 42 74 53 68 61 72 65  tePtrmap(BtShare
11a50 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 72 65 65  d *pBt){.  Btree
11a60 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
11a70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
11a80 70 4d 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  pMap ){.    sqli
11a90 74 65 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61  te3_free(pMap->a
11aa0 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 73  Rollback);.    s
11ab0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70  qlite3_free(pMap
11ac0 2d 3e 61 50 74 72 29 3b 0a 20 20 20 20 73 71 6c  ->aPtr);.    sql
11ad0 69 74 65 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e  ite3_free(pMap->
11ae0 61 53 76 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  aSvpt);.    sqli
11af0 74 65 33 5f 66 72 65 65 28 70 4d 61 70 29 3b 0a  te3_free(pMap);.
11b00 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
11b10 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  0;.  }.}.#else.#
11b20 64 65 66 69 6e 65 20 61 6c 6c 6f 63 61 74 65 50  define allocateP
11b30 74 72 6d 61 70 28 78 29 20 53 51 4c 49 54 45 5f  trmap(x) SQLITE_
11b40 4f 4b 0a 23 64 65 66 69 6e 65 20 64 65 6c 65 74  OK.#define delet
11b50 65 50 74 72 6d 61 70 28 78 29 20 0a 23 65 6e 64  ePtrmap(x) .#end
11b60 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  if../*.** Get a 
11b70 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
11b80 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
11b90 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ze it..**.** If 
11ba0 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65  pCur!=0 then the
11bb0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66   page is being f
11bc0 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f  etched as part o
11bd0 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  f a moveToChild(
11be0 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61  ).** call.  Do a
11bf0 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
11c00 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
11c10 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
11c20 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68  se..** And if th
11c30 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74  e fetch fails, t
11c40 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
11c50 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d   decrement pCur-
11c60 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  >iPage..**.** Th
11c70 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65  e page is fetche
11c80 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20  d as read-write 
11c90 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e  unless pCur is n
11ca0 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a  ot NULL and is.*
11cb0 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  * a read-only cu
11cc0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rsor..**.** If a
11cd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11ce0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
11cf0 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
11d00 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
11d10 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
11d20 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
11d30 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
11d40 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
11d50 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
11d60 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d80 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
11d90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
11da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11db0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11dc0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
11dd0 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
11de0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
11df0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11e00 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
11e10 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43  er here */.  BtC
11e20 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e40 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76  Cursor to receiv
11e50 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e  e the page, or N
11e60 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ULL */.  int bRe
11e70 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
11e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11e90 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
11ea0 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
11eb0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
11ec0 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
11ed0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11ee0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11ef0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
11f00 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65  Cur==0 || ppPage
11f10 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ==&pCur->apPage[
11f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
11f30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11f40 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
11f50 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
11f60 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
11f70 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
11f80 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
11f90 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
11fa0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
11fb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11fc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11fd0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11fe0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11ff0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12000 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
12010 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12020 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
12030 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
12040 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
12050 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12060 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
12070 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
12080 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12090 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
120a0 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
120b0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
120c0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
120d0 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
120e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
120f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12100 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
12110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Page);.      got
12120 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
12130 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
12140 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  }..  /* If obtai
12150 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
12160 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
12170 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
12180 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
12190 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
121a0 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
121b0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
121c0 72 0a 20 20 20 26 26 20 28 28 2a 70 70 50 61 67  r.   && ((*ppPag
121d0 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
121e0 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
121f0 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
12200 79 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  y).  ){.    rc =
12210 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12220 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73  BKPT;.    releas
12230 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12240 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12250 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12260 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12270 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
12280 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
12290 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d  if( pCur ) pCur-
122a0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74  >iPage--;.  test
122b0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
122c0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
122d0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
122e0 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
122f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12300 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
12310 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
12320 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
12330 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
12340 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12350 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
12360 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
12370 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
12380 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
12390 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
123a0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
123b0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
123c0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
123d0 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
123e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
123f0 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
12400 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
12410 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
12420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12430 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
12440 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
12450 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
12460 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12470 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
12480 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12490 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
124a0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
124b0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
124c0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
124d0 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
124e0 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
124f0 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
12500 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
12510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
12520 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
12530 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
12540 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
12550 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
12560 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
12570 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
12580 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
12590 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
125a0 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
125b0 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
125c0 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
125d0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
125e0 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
125f0 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
12600 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
12610 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
12620 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
12630 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
12640 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12650 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
12660 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
12670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12680 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
12690 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
126a0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
126b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
126c0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
126d0 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
126e0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
126f0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12700 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12710 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12720 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12730 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
12740 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
12750 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
12760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12770 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
12780 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
12790 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
127a0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
127b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
127c0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
127d0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
127e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
127f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12800 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12810 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12820 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12830 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
12840 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
12850 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
12860 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
12870 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
12880 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
12890 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
128a0 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
128b0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
128c0 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
128d0 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
128e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
128f0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12900 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12910 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12920 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12930 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12940 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12950 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12960 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12970 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12980 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
12990 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
129a0 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
129b0 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
129c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
129d0 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
129e0 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
129f0 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12a00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12a10 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12a20 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12a30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12a40 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12a50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12a60 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12a70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12a80 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12a90 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12aa0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12ab0 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
12ac0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
12ad0 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
12ae0 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12af0 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12b00 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12b10 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12b20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12b30 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12b40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12b50 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12b60 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12b70 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12b80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12b90 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
12ba0 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
12bb0 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
12bc0 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
12bd0 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
12be0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12bf0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12c00 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12c10 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12c20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12c30 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12c40 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12c50 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12c60 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12c70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12c80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
12c90 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12ca0 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
12cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12cc0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
12cd0 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
12ce0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12cf0 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12d00 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12d10 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12d20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12d30 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12d40 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12d50 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12d60 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12d70 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12d80 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
12d90 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
12da0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
12db0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
12dc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12dd0 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
12de0 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
12df0 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
12e00 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12e10 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
12e20 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
12e30 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
12e40 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
12e50 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
12e60 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
12e70 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
12e80 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
12e90 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
12ea0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
12eb0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
12ec0 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
12ed0 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
12ee0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
12ef0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
12f00 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
12f10 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12f20 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
12f30 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
12f40 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
12f50 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
12f60 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
12f70 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
12f80 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
12f90 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
12fa0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
12fb0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
12fc0 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
12fd0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
12fe0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
12ff0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
13000 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
13010 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
13020 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
13030 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
13040 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
13050 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
13060 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
13070 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
13080 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
13090 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
130a0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
130b0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
130c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
130d0 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
130e0 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
130f0 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
13100 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
13110 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
13120 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13130 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
13140 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
13150 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
13160 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
13170 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
13180 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
13190 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
131a0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
131b0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
131c0 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
131d0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
131e0 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
131f0 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
13200 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
13210 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
13220 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
13230 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
13240 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
13250 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
13260 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
13270 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
13280 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
13290 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
132a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
132b0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
132c0 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
132d0 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
132e0 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
132f0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
13310 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
13320 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13330 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
13340 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
13350 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
13360 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
13370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13380 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
13390 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
133a0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
133b0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
133c0 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
133d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
133e0 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
133f0 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
13400 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
13410 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
13420 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
13430 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
13440 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
13450 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
13460 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
13470 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
13480 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
13490 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
134a0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
134b0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
134c0 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
134d0 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
134e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
134f0 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
13500 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
13510 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
13520 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13530 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
13540 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
13550 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
13560 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
13570 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
13580 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
13590 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
135a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
135b0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
135c0 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
135d0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
135e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
135f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
13600 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13610 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
13620 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
13630 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
13640 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
13650 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13660 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
13670 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
13680 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
13690 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
136a0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
136b0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
136c0 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
136d0 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
136e0 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
136f0 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
13700 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
13710 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
13720 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13730 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
13740 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
13750 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
13760 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
13770 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
13780 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
13790 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
137a0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
137b0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
137c0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
137d0 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
137e0 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
137f0 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13800 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
13810 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
13820 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
13830 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
13840 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
13850 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
13860 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
13870 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
13880 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
13890 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
138a0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
138b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
138c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
138d0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
138e0 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
138f0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
13900 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13910 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
13920 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
13930 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
13940 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
13950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13960 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
13970 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13980 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
13990 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
139a0 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
139b0 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
139c0 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
139d0 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
139e0 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
139f0 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
13a00 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
13a10 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
13a20 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
13a30 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
13a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
13a50 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
13a60 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
13a70 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13a80 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
13a90 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
13aa0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
13ab0 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
13ac0 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
13ad0 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
13ae0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
13af0 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
13b00 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
13b10 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
13b20 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
13b30 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13b40 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
13b50 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
13b60 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
13b70 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
13b80 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
13b90 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
13ba0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13bb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13bd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
13be0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
13bf0 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
13c00 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
13c10 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
13c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13c40 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
13c50 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
13c90 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
13ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13cc0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
13cd0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13cf0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
13d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13d10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
13d20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
13d30 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
13d40 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
13d50 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
13d60 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
13d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13d80 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
13d90 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
13da0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
13db0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13dc0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13dd0 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
13de0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13df0 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
13e00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
13e10 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
13e20 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
13e30 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
13e40 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
13e50 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
13e60 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
13e70 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
13e80 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
13e90 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
13ea0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
13eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
13ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ed0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
13ee0 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
13ef0 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
13f00 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
13f10 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
13f20 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
13f30 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
13f40 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
13f50 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
13f60 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
13f70 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
13f80 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
13f90 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13fb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13fc0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13fe0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13ff0 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
14000 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14010 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14020 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14040 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
14050 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14060 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
14070 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14090 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
140a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
140b0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
140c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
140d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
140e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
140f0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
14100 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
14110 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14120 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
14130 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14140 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14150 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
14160 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
14170 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
14180 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
14190 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
141a0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
141b0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
141c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
141d0 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
141e0 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
141f0 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
14200 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
14210 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
14220 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
14230 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
14240 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
14250 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
14260 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
14270 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
14280 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
14290 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
142a0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
142b0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
142c0 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
142d0 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
142e0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
142f0 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
14300 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
14310 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
14320 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
14330 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
14340 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
14350 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
14360 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
14370 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
14380 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14390 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
143a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
143b0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
143c0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
143d0 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
143e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
143f0 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
14400 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
14410 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
14420 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
14430 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
14440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14450 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
14460 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14470 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
14480 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
14490 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
144a0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
144b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
144c0 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
144d0 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
144e0 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
144f0 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
14500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14510 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14520 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
14530 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
14540 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
14550 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
14560 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
14570 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
14580 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
14590 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
145a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
145b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
145c0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
145d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
145e0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
145f0 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
14600 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
14610 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
14620 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
14630 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
14640 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
14650 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
14660 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
14670 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
14680 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
14690 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
146a0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
146b0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
146c0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
146d0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
146e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
146f0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
14700 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
14710 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
14720 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
14730 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
14740 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
14750 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
14760 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
14770 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
14780 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
14790 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
147a0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
147b0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
147c0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
147d0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
147e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
147f0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
14800 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
14810 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
14820 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
14830 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
14840 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
14850 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
14860 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
14870 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
14880 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
14890 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
148a0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
148b0 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
148c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
148d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
148e0 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
148f0 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
14900 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
14910 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
14920 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
14930 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
14940 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
14950 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
14960 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
14970 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
14980 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14990 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
149a0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
149b0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
149c0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
149d0 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
149e0 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
149f0 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
14a00 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
14a10 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
14a20 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
14a30 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
14a40 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
14a50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
14a60 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
14a70 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
14a80 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14a90 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
14aa0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
14ab0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
14ac0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
14ad0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14ae0 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
14af0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
14b00 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
14b10 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
14b20 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
14b30 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
14b40 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
14b50 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
14b60 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
14b70 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
14b80 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
14b90 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14ba0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
14bb0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
14bc0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
14bd0 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
14be0 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
14bf0 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
14c00 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
14c10 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14c20 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14c30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14c50 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
14c60 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14c70 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14c80 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
14c90 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14ca0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14cb0 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
14cc0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
14cd0 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
14ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14cf0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
14d00 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
14d10 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
14d20 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
14d30 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14d40 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
14d50 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
14d60 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
14d70 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
14d80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
14d90 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
14da0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
14db0 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
14dc0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
14dd0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
14de0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
14df0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14e00 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
14e10 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
14e20 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
14e30 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
14e40 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
14e50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14e60 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
14e70 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
14e80 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
14e90 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
14ea0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
14eb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
14ec0 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14ed0 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14ee0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14ef0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14f00 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14f10 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
14f20 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
14f30 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
14f40 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
14f50 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
14f60 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14f70 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
14f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14f90 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
14fa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14fc0 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
14fd0 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
14fe0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
14ff0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
15000 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15010 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15020 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
15030 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
15040 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
15050 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15060 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
15070 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
15080 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15090 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
150a0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
150b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
150c0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
150d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
150e0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
150f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15100 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
15110 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15120 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
15130 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
15140 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
15150 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
15160 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
15170 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
15180 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
15190 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
151a0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
151b0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
151c0 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
151d0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
151e0 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
151f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
15200 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
15210 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
15220 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
15230 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
15240 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
15250 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
15260 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
15270 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
15280 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
15290 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
152a0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
152b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
152c0 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
152d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
152e0 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
152f0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
15300 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
15310 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
15320 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15330 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15340 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
15350 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
15360 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
15370 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
15380 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
15390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
153a0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
153b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
153c0 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
153d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
153e0 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
153f0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15400 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
15410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15420 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
15430 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
15440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
15460 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
15470 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
15480 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
15490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
154a0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
154b0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
154c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
154d0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
154e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
154f0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
15500 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15510 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
15520 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15530 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
15540 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
15550 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
15560 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
15570 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
15580 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
15590 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
155a0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
155b0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
155c0 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
155d0 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
155e0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
155f0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
15600 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15610 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
15620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
15630 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15640 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
15650 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
15660 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
15670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15680 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
15690 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
156a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
156b0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
156c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
156d0 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
156e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
156f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
15700 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
15710 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
15720 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
15730 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
15740 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
15750 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
15760 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
15770 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
15780 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
15790 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
157a0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
157b0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
157c0 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
157d0 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
157e0 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
157f0 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
15800 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
15810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15820 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
15830 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15840 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
15850 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
15860 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
15870 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
15880 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15890 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
158a0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
158b0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
158c0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
158d0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
158e0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
158f0 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
15900 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
15910 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
15920 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
15930 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
15940 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15950 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15960 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
15970 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
15980 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15990 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
159a0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
159b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
159c0 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
159d0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
159e0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
159f0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
15a00 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
15a10 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
15a20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
15a30 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
15a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15a50 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
15a60 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
15a70 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
15a80 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
15a90 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
15aa0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
15ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15ac0 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
15ad0 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
15ae0 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
15af0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
15b00 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
15b10 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
15b20 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
15b30 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
15b40 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
15b50 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
15b60 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
15b70 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
15b80 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
15b90 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
15ba0 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
15bb0 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
15bc0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
15bd0 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
15be0 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
15bf0 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
15c00 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
15c10 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
15c20 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
15c30 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
15c40 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
15c50 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
15c60 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
15c70 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
15c80 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
15c90 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
15ca0 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
15cb0 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
15cc0 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
15cd0 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
15ce0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
15cf0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
15d00 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
15d10 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
15d20 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
15d30 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
15d40 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
15d50 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
15d60 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
15d70 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
15d80 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
15d90 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
15da0 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
15db0 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
15dc0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
15dd0 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
15de0 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
15df0 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
15e00 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
15e10 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
15e20 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
15e30 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
15e40 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
15e50 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
15e60 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
15e70 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
15e80 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
15e90 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
15ea0 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
15eb0 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
15ec0 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
15ed0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
15ee0 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
15ef0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
15f00 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
15f10 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
15f20 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
15f30 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
15f40 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
15f50 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
15f60 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
15f70 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
15f80 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
15f90 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
15fa0 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
15fb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
15fc0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
15fd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
15fe0 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
15ff0 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
16000 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
16010 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16020 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
16030 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
16040 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
16050 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
16060 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
16070 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
16080 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
16090 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
160a0 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
160b0 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
160c0 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
160d0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
160e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
160f0 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
16100 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
16110 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
16120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16130 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
16140 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
16150 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16160 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
16170 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
16180 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
16190 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
161a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
161b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
161c0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
161d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
161e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
161f0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
16200 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
16210 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
16220 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
16230 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
16240 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
16250 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
16260 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16270 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
16280 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
16290 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
162a0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
162b0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
162c0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
162d0 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
162e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
162f0 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
16300 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
16310 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
16320 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
16330 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
16340 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
16350 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
16360 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16370 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
16380 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
16390 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
163a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
163b0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
163c0 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
163d0 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
163e0 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
163f0 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
16400 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
16410 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
16420 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16430 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
16440 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
16450 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
16460 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
16470 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
16480 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
16490 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
164a0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
164b0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
164c0 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
164d0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
164e0 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
164f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
16500 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
16510 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
16520 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
16530 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16540 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
16550 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16560 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
16570 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
16580 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
16590 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
165a0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
165b0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
165c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
165d0 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
165e0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
165f0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16610 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
16620 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16630 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16640 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
16650 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
16660 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
16670 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
16680 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
16690 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
166a0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
166b0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
166c0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
166d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
166e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
166f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16710 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
16720 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
16730 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
16740 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
16750 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
16760 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
16770 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
16780 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
16790 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
167a0 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
167b0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
167c0 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
167d0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
167e0 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
167f0 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
16800 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
16810 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
16820 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
16830 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
16840 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
16850 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
16860 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
16870 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
16880 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
16890 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
168a0 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
168b0 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
168c0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
168d0 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
168e0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
168f0 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
16900 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
16910 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
16920 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
16930 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
16940 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
16950 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
16960 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
16970 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
16980 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
16990 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
169a0 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
169b0 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
169c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
169d0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
169e0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
169f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16a00 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16a10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16a20 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16a30 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16a40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16a50 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16a60 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
16a70 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16a90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16ab0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
16ac0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
16ad0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
16ae0 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
16af0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
16b00 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
16b10 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
16b20 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
16b30 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
16b40 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
16b50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
16b60 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
16b70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16b80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16b90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16ba0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16bb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16bc0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
16bd0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
16be0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
16bf0 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
16c00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16c20 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
16c30 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
16c40 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
16c50 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
16c60 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
16c70 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
16c80 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
16c90 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
16ca0 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
16cb0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
16cc0 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
16cd0 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
16ce0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
16cf0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
16d00 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
16d10 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
16d20 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
16d30 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
16d40 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
16d50 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
16d60 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
16d70 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
16d80 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
16d90 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
16da0 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
16db0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
16dc0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
16dd0 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
16de0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
16df0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
16e00 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
16e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
16e20 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
16e30 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
16e40 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
16e50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
16e60 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
16e70 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
16e80 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
16e90 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
16ea0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
16eb0 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
16ec0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
16ed0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16ee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16ef0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16f00 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16f10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f20 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16f30 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
16f40 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
16f50 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16f60 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16f80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
16f90 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
16fa0 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
16fb0 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
16fc0 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
16fd0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
16fe0 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
16ff0 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
17000 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
17010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17020 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
17030 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
17040 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17050 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
17060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17070 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
17080 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
17090 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
170a0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
170b0 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
170c0 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
170d0 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
170e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
170f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17100 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
17120 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
17130 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
17140 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
17150 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
17160 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
17170 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
17180 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
17190 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
171a0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
171b0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
171c0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
171d0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
171e0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
171f0 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
17200 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
17210 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
17220 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
17230 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
17240 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
17250 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
17260 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
17270 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
17280 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
17290 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
172a0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
172b0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
172c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
172d0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
172e0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
172f0 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
17300 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
17310 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
17320 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
17330 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
17340 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
17350 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
17360 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
17370 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
17380 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
17390 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
173a0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
173b0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
173c0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
173d0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
173e0 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
173f0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
17400 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
17410 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
17420 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
17430 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
17440 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
17450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17460 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
17470 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
17480 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
17490 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
174a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
174b0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
174c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
174d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
174e0 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
174f0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
17500 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17510 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
17520 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
17530 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
17540 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
17550 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17560 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
17570 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
17580 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17590 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
175a0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
175b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
175c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
175d0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
175e0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
175f0 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
17600 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
17610 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
17620 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
17630 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
17640 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
17650 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
17660 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
17670 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
17680 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
17690 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
176a0 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
176b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
176c0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
176d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
176e0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
176f0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
17700 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
17710 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
17720 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
17730 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17740 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
17750 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
17760 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
17770 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
17780 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
17790 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
177a0 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
177b0 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
177c0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
177d0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
177e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
177f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17800 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17810 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
17820 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
17830 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17840 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
17850 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
17860 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
17870 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
17880 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
17890 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
178a0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
178b0 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
178c0 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
178d0 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
178e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
178f0 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
17900 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
17910 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
17920 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
17930 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
17940 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
17950 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
17960 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
17970 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
17980 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
17990 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
179a0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
179b0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
179c0 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
179d0 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
179e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
179f0 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
17a00 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
17a10 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
17a20 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
17a30 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
17a40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
17a50 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
17a60 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
17a70 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
17a80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17a90 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
17aa0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
17ab0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17ac0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17ad0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
17ae0 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
17af0 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
17b00 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
17b10 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
17b20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17b30 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17b40 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17b50 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
17b60 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
17b70 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
17b80 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
17b90 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
17ba0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
17bb0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
17bc0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
17bd0 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
17be0 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
17bf0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17c00 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
17c10 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
17c20 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
17c30 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
17c40 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
17c50 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
17c60 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
17c70 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
17c80 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
17c90 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
17ca0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17cb0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
17cc0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
17cd0 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
17ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17cf0 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
17d00 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17d10 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
17d20 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17d30 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
17d40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17d50 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17d60 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17d70 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17d80 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
17d90 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
17da0 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
17db0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
17dc0 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
17dd0 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
17de0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
17df0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
17e00 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
17e10 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
17e20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17e30 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
17e40 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17e50 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17e60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17e70 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17e80 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
17e90 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
17ea0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
17eb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17ec0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17ed0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
17ee0 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
17ef0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
17f00 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
17f10 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
17f20 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
17f30 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
17f40 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
17f50 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
17f60 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17f70 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
17f80 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
17f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17fa0 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
17fb0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
17fc0 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
17fd0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17fe0 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
17ff0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18000 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
18010 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
18020 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
18030 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
18040 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
18050 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
18060 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
18070 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
18080 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
18090 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
180a0 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
180b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
180c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
180d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
180e0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
180f0 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
18100 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
18110 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
18120 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
18130 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
18140 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
18150 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
18160 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
18170 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
18180 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
18190 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
181a0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
181b0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
181c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
181d0 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
181e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
181f0 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
18200 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
18210 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
18220 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
18230 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
18240 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
18250 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
18260 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18270 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
18280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
18290 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
182a0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
182b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
182c0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
182d0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
182e0 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
182f0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
18300 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
18310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
18320 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
18330 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18340 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
18350 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
18360 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
18370 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
18380 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18390 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
183a0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
183b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
183c0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
183d0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
183e0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
183f0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
18400 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18410 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
18420 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
18430 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
18440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
18450 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18460 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
18470 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
18480 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
18490 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
184a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
184b0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
184c0 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
184d0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
184e0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
184f0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
18500 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
18510 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
18520 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
18530 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18540 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18550 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
18560 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
18570 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
18580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18590 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
185a0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
185b0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
185c0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
185d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
185e0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
185f0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
18600 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
18610 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
18620 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
18630 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
18640 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
18650 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
18660 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
18670 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
18680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
18690 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
186a0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
186b0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
186c0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
186d0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
186e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
186f0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
18700 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
18710 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
18720 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
18730 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
18740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
18750 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
18760 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18770 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18780 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
18790 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
187a0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
187b0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
187c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
187d0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
187e0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
187f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18800 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
18810 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
18820 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18830 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18840 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18850 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
18860 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
18870 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
18880 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
18890 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
188a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
188b0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
188c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
188d0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
188e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
188f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
18900 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
18910 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
18920 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
18930 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
18940 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
18950 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
18960 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
18970 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
18980 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
18990 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
189a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
189b0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
189c0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
189d0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
189e0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
189f0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
18a00 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
18a10 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
18a20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
18a30 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
18a40 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
18a50 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
18a60 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
18a70 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
18a80 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
18a90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18aa0 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
18ab0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
18ac0 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
18ad0 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
18ae0 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
18af0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
18b00 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
18b10 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
18b20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
18b30 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
18b40 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
18b50 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
18b60 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
18b70 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
18b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18b90 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18ba0 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
18bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
18bc0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
18bd0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
18be0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
18bf0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
18c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
18c10 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
18c20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18c30 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18c40 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
18c50 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
18c60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
18c70 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
18c80 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
18c90 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
18ca0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18cb0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18cc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
18cd0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
18ce0 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
18cf0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
18d00 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
18d10 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
18d20 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
18d30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
18d40 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
18d50 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
18d60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
18d70 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
18d80 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
18d90 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
18da0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
18db0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
18dc0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
18dd0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
18de0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
18df0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
18e00 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
18e10 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
18e20 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
18e30 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
18e40 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
18e50 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
18e60 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
18e70 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
18e80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18e90 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
18ea0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18eb0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
18ec0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
18ed0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
18ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18ef0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
18f00 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
18f10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18f30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18f40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
18f50 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
18f60 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
18f70 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
18f80 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
18f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
18fb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
18fc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18fd0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18fe0 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18ff0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
19000 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
19010 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
19020 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
19030 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
19040 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
19050 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
19060 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
19070 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
19080 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
19090 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
190a0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
190b0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
190c0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
190d0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
190e0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
190f0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
19100 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
19110 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
19120 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19130 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19140 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19150 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
19160 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
19170 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
19180 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
19190 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
191a0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
191b0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
191c0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
191d0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
191e0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
191f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19200 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
19210 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
19220 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
19230 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19240 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19250 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
19260 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
19270 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
19280 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
19290 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
192a0 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
192b0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
192c0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
192d0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
192e0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
192f0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
19300 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
19310 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19320 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19330 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19340 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19350 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19360 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19370 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
19380 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
19390 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
193a0 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
193b0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
193c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
193d0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
193e0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
193f0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
19400 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
19410 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
19420 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19430 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19440 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19450 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19460 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19470 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
19480 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
19490 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
194a0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
194b0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
194c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
194d0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
194e0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
194f0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
19500 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
19510 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
19520 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19530 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19540 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19560 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19570 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
19580 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
19590 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
195a0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
195b0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
195c0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
195d0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
195e0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
195f0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
19600 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
19610 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19620 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
19630 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19640 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19650 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
19660 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
19670 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19680 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19690 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
196a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
196b0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
196c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
196d0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
196e0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
196f0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
19700 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
19710 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
19720 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
19730 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
19760 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
19770 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
19790 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
197a0 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
197b0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
197c0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
197d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
197e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
197f0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19800 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19810 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19820 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
19830 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19840 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19850 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19860 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19870 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19880 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19890 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
198a0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
198b0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
198c0 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
198d0 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
198e0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
198f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19900 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19910 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19920 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19930 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19940 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19950 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19960 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19970 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19980 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19990 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
199a0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
199b0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
199c0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
199d0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
199e0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
199f0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
19a00 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19a10 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19a20 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19a30 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19a40 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19a50 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19a60 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19a70 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19a80 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19a90 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19aa0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
19ab0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
19ac0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
19ad0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
19ae0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
19af0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
19b00 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19b10 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19b20 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19b30 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19b40 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19b50 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19b60 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19b70 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19b80 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19b90 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19ba0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
19bb0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
19bc0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
19bd0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
19be0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
19bf0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
19c00 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19c10 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19c20 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19c30 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19c40 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19c50 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19c60 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19c70 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19c80 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19c90 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19ca0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19cb0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19cc0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19cd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
19ce0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
19cf0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
19d00 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19d10 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
19d20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19d30 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19d40 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19d50 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19d60 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19d70 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19d80 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19d90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19da0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19db0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19dc0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19dd0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19de0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19df0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19e00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19e10 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19e20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19e30 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
19e40 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
19e50 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19e60 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
19e70 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19e80 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
19e90 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19ea0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19eb0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19ec0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19ed0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19ee0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19ef0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19f00 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19f10 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19f20 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19f30 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
19f40 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
19f50 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19f60 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
19f70 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
19f80 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
19f90 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19fa0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19fb0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
19fc0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
19fd0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19fe0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19ff0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1a000 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1a010 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1a020 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1a030 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1a040 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1a050 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1a060 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1a070 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a080 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a090 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a0a0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a0b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a0c0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1a0d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1a0e0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1a0f0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1a100 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1a110 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1a120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1a130 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a140 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1a150 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1a160 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1a170 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1a180 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1a190 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1a1a0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1a1b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1a1c0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1a1d0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1a1e0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1a1f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a200 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a210 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a220 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a230 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a240 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a250 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a260 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a270 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a280 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a290 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a2a0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a2b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a2c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a2d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a2e0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a2f0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a300 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a310 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a320 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a330 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a340 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a350 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a360 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a370 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a390 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a3a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a3b0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a3c0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a3d0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a3e0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a3f0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a400 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a410 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a420 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a430 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a440 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a450 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a460 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a470 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a480 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a490 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a4a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a4b0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a4c0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a4d0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a4e0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a4f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a500 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a510 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a520 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a530 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a550 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a560 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a570 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a580 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a590 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a5a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a5b0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a5c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a5d0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a5e0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a5f0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a600 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a610 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a620 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a630 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a640 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a650 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a660 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a670 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a680 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a690 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a6a0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a6b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a6c0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a6d0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a6e0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a6f0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a700 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a710 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a720 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a730 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a740 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a750 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a760 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a770 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a780 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a790 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a7a0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a7b0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a7c0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a7d0 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a7e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a7f0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a800 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a810 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a820 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a830 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a840 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1a850 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1a860 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1a870 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1a880 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a890 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1a8a0 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1a8b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1a8c0 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1a8d0 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1a8e0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1a8f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a900 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1a910 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1a920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a930 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1a940 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1a950 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1a960 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1a970 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1a980 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1a990 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1a9a0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1a9b0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1a9c0 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1a9d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1a9e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a9f0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1aa00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1aa10 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1aa20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1aa30 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1aa40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1aa50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1aa60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1aa70 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1aa80 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1aa90 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1aaa0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1aab0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1aac0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1aad0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1aae0 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1aaf0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1ab00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1ab10 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1ab20 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1ab30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1ab40 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1ab50 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1ab60 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1ab70 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1ab80 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1ab90 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1aba0 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1abb0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1abc0 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1abd0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1abe0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1abf0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1ac00 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1ac10 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1ac20 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1ac30 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1ac40 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1ac50 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1ac60 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1ac70 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1ac80 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1ac90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1aca0 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1acb0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1acc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1acd0 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1ace0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1acf0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1ad00 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ad10 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1ad20 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1ad30 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1ad40 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ad50 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1ad60 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ad70 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1ad80 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ad90 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1ada0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1adb0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1adc0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1add0 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1ade0 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1adf0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1ae00 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1ae10 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1ae20 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1ae30 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1ae40 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1ae50 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1ae60 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1ae70 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1ae80 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1ae90 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1aea0 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1aeb0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1aec0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1aed0 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1aee0 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1aef0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1af00 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1af10 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1af20 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1af30 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1af40 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1af50 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1af60 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1af70 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1af80 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1af90 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1afa0 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1afb0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1afc0 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1afd0 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1afe0 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1aff0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1b000 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1b010 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1b020 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1b030 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1b040 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1b050 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1b060 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1b070 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1b080 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1b090 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1b0a0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1b0b0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1b0c0 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1b0d0 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1b0e0 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1b0f0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1b100 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b110 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1b120 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1b130 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f  .  sqlite3 *pBlo
1b140 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ck = 0;.  BtShar
1b150 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b160 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b170 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
1b180 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b190 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b1a0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1b1b0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1b1c0 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1b1d0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1b1e0 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1b1f0 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1b200 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1b210 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1b220 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1b230 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1b240 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1b250 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b260 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1b270 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1b280 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1b290 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b2a0 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1b2b0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b2c0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b2d0 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1b2e0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1b2f0 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
1b300 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
1b310 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
1b320 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
1b330 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1b340 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1b350 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1b360 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
1b370 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
1b380 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1b390 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b3a0 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
1b3b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b3c0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
1b3d0 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1b3e0 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1b3f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1b400 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1b410 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
1b420 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
1b430 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
1b440 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
1b450 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
1b460 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1b470 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1b480 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
1b490 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b4a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b4b0 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42  WRITE).   || (pB
1b4c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1b4d0 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20  S_PENDING)!=0.  
1b4e0 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
1b4f0 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1b500 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
1b510 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
1b520 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
1b530 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1b540 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1b550 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1b560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
1b570 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1b580 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
1b590 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b5a0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
1b5b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b5c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
1b5d0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1b5e0 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1b5f0 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1b600 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1b610 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1b620 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
1b630 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1b640 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1b650 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1b660 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1b670 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1b680 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1b690 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1b6a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1b6b0 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1b6c0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1b6d0 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1b6e0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1b6f0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1b700 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1b710 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1b720 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1b730 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1b740 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1b750 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b760 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1b770 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1b780 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1b790 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1b7a0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1b7b0 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1b7c0 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1b7d0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1b7e0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1b7f0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1b800 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1b810 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1b820 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1b830 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1b840 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1b850 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1b860 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1b870 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1b880 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1b890 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1b8a0 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1b8b0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1b8c0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1b8d0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1b8e0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1b8f0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1b900 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1b910 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1b920 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1b930 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1b940 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1b950 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1b960 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1b970 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1b980 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1b990 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1b9a0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1b9b0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1b9c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b9d0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1b9e0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1b9f0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1ba00 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1ba10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ba20 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1ba30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ba40 20 20 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20       int exFlag 
1ba50 3d 20 28 70 2d 3e 64 62 2d 3e 62 55 6e 6c 6f 63  = (p->db->bUnloc
1ba60 6b 65 64 20 26 26 20 21 49 53 41 55 54 4f 56 41  ked && !ISAUTOVA
1ba70 43 55 55 4d 29 20 3f 20 2d 31 20 3a 20 28 77 72  CUUM) ? -1 : (wr
1ba80 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
1ba90 20 69 6e 74 20 62 53 75 62 6a 49 6e 4d 65 6d 20   int bSubjInMem 
1baa0 3d 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  = sqlite3TempInM
1bab0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 3b 0a 20 20  emory(p->db);.  
1bac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1bad0 3e 64 62 2d 3e 62 55 6e 6c 6f 63 6b 65 64 3d 3d  >db->bUnlocked==
1bae0 30 20 7c 7c 20 77 72 66 6c 61 67 3d 3d 31 20 29  0 || wrflag==1 )
1baf0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1bb00 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1bb10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78  (pBt->pPager, ex
1bb20 46 6c 61 67 2c 20 62 53 75 62 6a 49 6e 4d 65 6d  Flag, bSubjInMem
1bb30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1bb40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bb50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1bb60 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1bb70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bb80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bb90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bba0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
1bbb0 74 72 6d 61 70 28 70 42 74 29 3b 0a 20 20 20 20  trmap(pBt);.    
1bbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bbd0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1bbe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bbf0 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1bc00 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1bc10 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1bc20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1bc30 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1bc40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1bc50 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1bc60 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1bc70 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1bc80 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
1bc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bca0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1bcb0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1bcc0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1bcd0 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1bce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1bcf0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1bd00 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1bd10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1bd20 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1bd30 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1bd40 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1bd50 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1bd60 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1bd70 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1bd80 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1bd90 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1bda0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1bdb0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1bdc0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1bdd0 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1bde0 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1bdf0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1be00 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1be10 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1be20 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1be30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1be40 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1be50 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1be60 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1be70 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1be80 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1be90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1bea0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1beb0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1bec0 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1bed0 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1bee0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1bef0 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1bf00 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1bf10 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1bf20 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1bf30 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1bf40 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1bf50 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1bf60 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1bf70 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1bf80 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1bf90 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1bfa0 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1bfb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bfc0 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1bfd0 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1bfe0 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1bff0 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1c000 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1c010 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1c020 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1c030 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1c040 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1c050 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1c060 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1c070 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1c080 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1c090 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1c0a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c0b0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1c0c0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1c0d0 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1c0e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c0f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1c100 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1c110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c130 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1c140 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1c150 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1c160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c170 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
1c180 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1c190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c1a0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1c1b0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1c1c0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1c1d0 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1c1e0 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1c1f0 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1c200 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1c210 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1c220 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1c230 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1c240 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1c250 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1c260 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1c270 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1c280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1c290 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   nSavepoint = p-
1c2a0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  >db->nSavepoint;
1c2b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c2c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1c2d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1c2e0 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   nSavepoint);.  
1c2f0 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61 70 20    if( pBt->pMap 
1c300 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1c310 20 26 26 20 6e 53 61 76 65 70 6f 69 6e 74 20 29   && nSavepoint )
1c320 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
1c330 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70 42  eePtrmapBegin(pB
1c340 74 2d 3e 70 4d 61 70 2c 20 6e 53 61 76 65 70 6f  t->pMap, nSavepo
1c350 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  int);.    }.  }.
1c360 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1c370 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
1c380 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1c3a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c3b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
1c3c0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
1c3d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
1c3e0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
1c3f0 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
1c400 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
1c410 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
1c420 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1c430 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
1c440 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
1c450 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
1c460 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1c470 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
1c480 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
1c490 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
1c4a0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
1c4b0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4d0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
1c4e0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
1c4f0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c510 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
1c520 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
1c530 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c560 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
1c570 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1c580 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
1c590 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1c5a0 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
1c5b0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1c5c0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1c5d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c5e0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1c5f0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
1c600 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1c610 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1c620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1c630 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
1c640 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
1c650 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1c660 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
1c670 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1c680 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
1c690 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1c6a0 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
1c6b0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
1c6c0 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
1c6d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1c6e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
1c6f0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1c700 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
1c710 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1c720 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1c730 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1c740 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
1c750 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1c760 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1c770 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1c780 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1c790 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1c7a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1c7b0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1c7c0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1c7d0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1c7e0 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
1c7f0 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1c800 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
1c810 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1c820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c830 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1c840 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1c850 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1c860 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1c870 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1c880 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1c890 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1c8a0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1c8b0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1c8c0 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1c8d0 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1c8e0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1c8f0 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1c900 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1c910 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1c920 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1c930 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1c940 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1c950 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1c960 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1c970 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1c980 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1c990 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1c9a0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1c9c0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1c9d0 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1c9e0 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1c9f0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ca00 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1ca10 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1ca20 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1ca30 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1ca60 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1ca70 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1ca80 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1ca90 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1caa0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1cab0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1cac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cad0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1cae0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1caf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cb00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1cb10 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1cb20 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1cb30 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1cb40 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1cb50 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1cb60 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1cb70 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1cb80 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1cb90 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1cba0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1cbb0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1cbc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cbd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1cbe0 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1cbf0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1cc00 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1cc10 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
1cc20 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1cc30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1cc40 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
1cc50 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20  int rc;..    rc 
1cc60 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1cc70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1cc80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1cc90 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1cca0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1ccb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1ccc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1ccd0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1cce0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1ccf0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1cd00 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1cd10 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1cd20 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1cd30 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1cd40 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1cd50 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1cd60 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
1cd70 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20  low.         && 
1cd80 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
1cd90 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61  flow+3<=pPage->a
1cda0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
1cdb0 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26  Page.         &&
1cdc0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1cdd0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
1cde0 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20  erflow]).       
1cdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1ce00 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
1ce10 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
1ce20 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1ce30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1ce40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ce50 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1ce60 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1ce70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1ce80 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1ce90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1cea0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1ceb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1cec0 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1ced0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1cee0 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1cef0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1cf00 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1cf10 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1cf20 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1cf30 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1cf40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1cf50 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
1cf60 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1cf70 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1cf80 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1cf90 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
1cfa0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
1cfb0 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1cfc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1cfd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1cfe0 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1cff0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1d000 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1d010 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1d020 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1d030 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1d040 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1d050 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1d060 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1d070 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1d080 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1d090 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1d0a0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1d0b0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1d0c0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1d0d0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1d0e0 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1d0f0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1d100 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1d110 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1d120 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1d130 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1d140 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1d150 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1d160 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1d170 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1d180 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1d190 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1d1a0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1d1b0 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d1d0 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1d1e0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1d1f0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1d200 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1d210 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1d220 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1d230 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1d240 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1d250 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1d260 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1d270 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1d280 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1d290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1d2a0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1d2b0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1d2c0 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1d2d0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1d2e0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1d2f0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1d300 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1d310 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1d320 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1d330 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1d340 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1d350 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1d360 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1d370 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1d380 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1d390 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1d3a0 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1d3b0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1d3c0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1d3d0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1d3e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d3f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d400 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d410 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1d420 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1d430 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1d440 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1d450 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1d460 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1d470 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1d480 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1d490 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1d4a0 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1d4b0 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1d4c0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1d4d0 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1d4e0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1d4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d500 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1d510 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1d520 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1d530 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1d540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d550 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d560 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1d570 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1d580 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1d590 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1d5a0 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1d5b0 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1d5c0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1d5d0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1d5e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1d5f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1d600 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1d610 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1d620 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1d630 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1d640 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1d650 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1d660 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1d670 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1d680 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1d690 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1d6a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1d6b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1d6c0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1d6d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1d6e0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1d6f0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1d700 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1d710 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1d720 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1d730 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1d740 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d750 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1d760 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1d770 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d7a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d7b0 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1d7c0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1d7d0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1d7e0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1d7f0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1d800 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1d810 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d820 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1d830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d850 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d870 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1d880 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1d890 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1d8a0 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1d8b0 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1d8c0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1d8d0 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1d8e0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1d8f0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1d900 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1d910 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d920 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1d930 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1d940 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1d950 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1d960 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1d970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d980 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d990 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1d9a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d9b0 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1d9c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1d9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d9e0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1d9f0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1da00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1da10 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1da20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1da30 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1da40 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1da50 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1da60 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1da70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1da80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1da90 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1daa0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1dab0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1dac0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1dad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1dae0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1daf0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1db00 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1db10 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1db20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1db30 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1db40 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1db50 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1db60 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1db70 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1db80 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1db90 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1dba0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1dbb0 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1dbc0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1dbd0 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1dbe0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1dbf0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1dc00 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1dc10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1dc20 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1dc30 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1dc40 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1dc50 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1dc60 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1dc70 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1dc80 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1dc90 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1dca0 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1dcb0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1dcc0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1dcd0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1dce0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1dcf0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1dd00 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1dd10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1dd20 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1dd30 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1dd40 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1dd50 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1dd60 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1dd70 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1dd80 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1dd90 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1dda0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1ddb0 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1ddc0 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1ddd0 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1dde0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1ddf0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1de00 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1de10 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1de20 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1de30 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1de40 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1de50 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1de60 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1de70 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1de80 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1de90 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1dea0 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1deb0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1dec0 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1ded0 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1dee0 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1def0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1df00 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1df10 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1df20 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1df30 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1df40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1df50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1df60 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1df70 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1df80 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1df90 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1dfa0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1dfb0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1dfc0 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1dfd0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1dfe0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1dff0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1e000 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e010 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1e020 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1e030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e040 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1e050 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1e060 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1e070 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1e080 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1e090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e0a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e0b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1e0c0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1e0d0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1e0e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e0f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1e100 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1e110 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1e120 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1e130 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1e140 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1e150 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1e160 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1e170 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1e180 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1e190 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1e1a0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1e1b0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1e1c0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1e1d0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1e1e0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1e1f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1e200 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1e210 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1e220 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1e230 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1e240 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1e250 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e260 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1e270 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1e280 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1e290 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1e2a0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1e2b0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1e2c0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1e2d0 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1e2e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e2f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e320 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e330 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1e340 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e350 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1e360 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1e370 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1e380 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1e390 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1e3a0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1e3b0 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1e3c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1e3d0 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1e3e0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1e3f0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1e400 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1e410 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1e420 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1e430 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1e440 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1e450 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1e460 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1e470 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1e480 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1e490 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1e4a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1e4b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e4c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e4d0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1e4e0 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1e4f0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1e500 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1e510 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1e520 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1e530 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1e540 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1e550 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1e560 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1e570 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1e580 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1e590 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1e5a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1e5b0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1e5c0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1e5d0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1e5e0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1e5f0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1e600 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1e610 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1e620 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1e630 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1e640 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1e650 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1e660 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1e670 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1e680 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1e690 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1e6a0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1e6b0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1e6c0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1e6d0 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1e6e0 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1e6f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e710 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1e720 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1e730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1e750 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1e760 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1e770 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1e780 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1e790 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1e7a0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1e7b0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1e7c0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1e7d0 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1e7e0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1e7f0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1e800 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e810 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1e820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1e840 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1e850 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e860 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1e870 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1e880 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1e890 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1e8a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e8b0 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1e8c0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1e8d0 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1e8e0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1e8f0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1e900 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1e910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e920 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1e930 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1e940 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1e950 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1e960 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e970 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1e980 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1e990 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1e9a0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1e9b0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1e9c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e9d0 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1e9e0 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1e9f0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1ea00 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1ea10 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1ea20 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1ea30 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1ea40 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ea70 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1ea80 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1ea90 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1eac0 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1ead0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1eae0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb00 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1eb10 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1eb20 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1eb30 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1eb40 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1eb50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1eb60 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1eb70 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1eb80 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1eb90 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1eba0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ebb0 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1ebc0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ebd0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1ebe0 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1ebf0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1ec00 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1ec10 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1ec20 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ec30 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1ec40 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1ec50 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1ec60 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1ec70 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1ec80 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1ec90 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1eca0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1ecb0 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1ecc0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1ecd0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1ece0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1ecf0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1ed00 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1ed10 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1ed20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1ed30 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1ed40 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1ed50 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1ed60 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1ed70 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ed80 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1ed90 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1eda0 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1edb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1edc0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1edd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1ede0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1edf0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1ee00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1ee10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1ee20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1ee30 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1ee40 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ee50 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1ee60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ee70 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ee80 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1ee90 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1eea0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1eeb0 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1eec0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1eed0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1eee0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1eef0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1ef00 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1ef10 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1ef20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1ef30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ef40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ef50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1ef60 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1ef70 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1ef80 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1ef90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1efa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1efb0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1efc0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1efd0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1efe0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1eff0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1f000 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1f010 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f040 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1f050 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f060 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f070 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f080 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1f090 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1f0a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f0b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1f0c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1f0d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f0e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1f0f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1f100 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1f110 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1f120 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1f130 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1f140 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1f150 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1f160 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1f170 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1f180 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1f190 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1f1a0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1f1b0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1f1c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1f1d0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1f1e0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1f1f0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1f200 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1f210 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1f220 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1f230 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1f240 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1f250 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1f260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1f270 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1f280 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1f290 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f2a0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1f2b0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1f2c0 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1f2d0 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1f2e0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1f2f0 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
1f300 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f310 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1f320 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1f330 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1f340 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1f350 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1f360 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1f370 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1f380 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1f390 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f3a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1f3b0 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1f3c0 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1f3d0 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1f3e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f3f0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1f400 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1f410 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1f420 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1f430 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1f440 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1f450 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1f460 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1f470 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1f480 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1f490 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1f4a0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1f4b0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f4c0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1f4d0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1f4e0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1f4f0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1f500 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1f510 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1f520 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1f530 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1f540 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1f550 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1f560 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1f570 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1f580 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1f590 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1f5a0 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1f5b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f5c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f5d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f5e0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1f5f0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1f600 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f610 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1f620 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1f630 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1f640 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1f650 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f660 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f670 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1f680 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1f690 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1f6a0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1f6b0 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1f6c0 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1f6d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1f6e0 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1f6f0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1f700 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1f710 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1f720 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1f730 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1f740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1f750 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1f760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f770 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1f780 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f790 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f7a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f7b0 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1f7c0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f7d0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1f7e0 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1f7f0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f800 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1f810 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1f820 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1f830 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1f840 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1f850 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1f860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f870 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1f880 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1f890 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1f8a0 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1f8b0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1f8c0 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1f8d0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1f8e0 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1f8f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f900 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1f910 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1f920 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1f930 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 2d 74 72  ../*.** The b-tr
1f940 65 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  ee handle passed
1f950 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1f960 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
1f970 6f 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a 2a 20 55  o commit an.** U
1f980 4e 4c 4f 43 4b 45 44 20 74 72 61 6e 73 61 63 74  NLOCKED transact
1f990 69 6f 6e 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ion. At this poi
1f9a0 6e 74 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  nt it is guarant
1f9b0 65 65 64 20 74 68 61 74 20 74 68 69 73 20 69 73  eed that this is
1f9c0 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 2d 20   .** possible - 
1f9d0 74 68 65 20 77 61 6c 20 57 52 49 54 45 52 20 6c  the wal WRITER l
1f9e0 6f 63 6b 20 69 73 20 68 65 6c 64 20 61 6e 64 20  ock is held and 
1f9f0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74  it is known that
1fa00 20 74 68 65 72 65 20 61 72 65 20 0a 2a 2a 20 6e   there are .** n
1fa10 6f 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  o conflicts with
1fa20 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73   committed trans
1fa30 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  actions..*/.stat
1fa40 69 63 20 69 6e 74 20 62 74 72 65 65 46 69 78 55  ic int btreeFixU
1fa50 6e 6c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70  nlocked(Btree *p
1fa60 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1fa70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
1fa80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1fa90 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1faa0 75 38 20 2a 70 31 20 3d 20 70 50 61 67 65 31 2d  u8 *p1 = pPage1-
1fab0 3e 61 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >aData;.  Pager 
1fac0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1fad0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1fae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1faf0 2f 2a 20 49 66 20 70 61 67 65 20 31 20 6f 66 20  /* If page 1 of 
1fb00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fb10 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
1fb20 65 6e 20 6e 6f 20 70 61 67 65 73 20 77 65 72 65  en no pages were
1fb30 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
1fb40 6f 72 20 66 72 65 65 64 20 62 79 20 74 68 69 73  or freed by this
1fb50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1fb60 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 73 70   this case no sp
1fb70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69  ecial handling i
1fb80 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
1fb90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1fba0 70 61 67 65 20 31 20 69 73 20 64 69 72 74 79 2c  page 1 is dirty,
1fbb0 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
1fbc0 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61  BtreePtrmap *pMa
1fbd0 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20  p = pBt->pMap;. 
1fbe0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 67   Pgno iTrunk = g
1fbf0 65 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 29  et4byte(&p1[32])
1fc00 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d  ;.  Pgno nPage =
1fc10 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1fc20 70 42 74 29 3b 0a 20 20 50 67 6e 6f 20 6e 4f 72  pBt);.  Pgno nOr
1fc30 69 67 20 3d 20 70 4d 61 70 2d 3e 69 46 69 72 73  ig = pMap->iFirs
1fc40 74 2d 31 3b 0a 20 20 75 33 32 20 6e 46 72 65 65  t-1;.  u32 nFree
1fc50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
1fc60 33 36 5d 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  36]);..  assert(
1fc70 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 55   sqlite3PagerIsU
1fc80 6e 6c 6f 63 6b 65 64 28 70 50 61 67 65 72 29 20  nlocked(pPager) 
1fc90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1fca0 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d  ->pMap );.  rc =
1fcb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67   sqlite3PagerUpg
1fcc0 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61  radeSnapshot(pPa
1fcd0 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62  ger, pPage1->pDb
1fce0 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
1fcf0 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61   p1==pPage1->aDa
1fd00 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ta );..  if( rc=
1fd10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fd20 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20    Pgno nHPage = 
1fd30 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  get4byte(&p1[28]
1fd40 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
1fd50 61 6c 20 3d 20 6e 48 50 61 67 65 3b 0a 0a 20 20  al = nHPage;..  
1fd60 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
1fd70 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1fd80 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
1fd90 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54  {.      Pgno iHT
1fda0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1fdb0 26 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  &p1[32]);.      
1fdc0 75 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74  u32 nHFree = get
1fdd0 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a  4byte(&p1[36]);.
1fde0 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68  .      /* Attach
1fdf0 20 74 68 65 20 68 65 61 64 20 64 61 74 61 62 61   the head databa
1fe00 73 65 20 66 72 65 65 20 6c 69 73 74 20 74 6f 20  se free list to 
1fe10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
1fe20 75 72 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  urrent.      ** 
1fe30 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 65  transactions fre
1fe40 65 2d 6c 69 73 74 20 28 69 66 20 61 6e 79 29 2e  e-list (if any).
1fe50 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
1fe60 54 72 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Trunk!=0 ){.    
1fe70 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31      put4byte(&p1
1fe80 5b 33 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20 6e  [36], nHFree + n
1fe90 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Free);.        p
1fea0 75 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 2c  ut4byte(&p1[32],
1feb0 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20   iTrunk);.      
1fec0 20 20 77 68 69 6c 65 28 20 69 54 72 75 6e 6b 20    while( iTrunk 
1fed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50  ){.          DbP
1fee0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73 71  age *pTrunk = sq
1fef0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1ff00 28 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 29  (pPager, iTrunk)
1ff10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 72 75  ;.          iTru
1ff20 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 28 75  nk = get4byte((u
1ff30 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61  8*)pTrunk->pData
1ff40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ff50 20 69 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20   iTrunk==0 ){.  
1ff60 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1ff70 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e  te((u8*)pTrunk->
1ff80 70 44 61 74 61 2c 20 69 48 54 72 75 6e 6b 29 3b  pData, iHTrunk);
1ff90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ffa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1ffb0 67 65 72 55 6e 72 65 66 28 70 54 72 75 6e 6b 29  gerUnref(pTrunk)
1ffc0 3b 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  ;.        };.   
1ffd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
1ffe0 6e 48 50 61 67 65 3c 6e 4f 72 69 67 20 29 7b 0a  nHPage<nOrig ){.
1fff0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20000 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20020 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
20030 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
20040 6e 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  n allocated page
20050 73 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 74  s pMap->iFirst t
20060 68 72 6f 75 67 68 0a 20 20 20 20 20 20 20 20 2a  hrough.        *
20070 2a 20 6e 50 61 67 65 20 28 69 6e 63 6c 75 73 69  * nPage (inclusi
20080 76 65 29 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ve) at the end o
20090 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
200a0 69 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a  ile. Meanwhile,.
200b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
200c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68 61   transactions ha
200d0 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 46  ve allocated (iF
200e0 69 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53  irst..nHPage). S
200f0 6f 20 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  o move.        *
20100 2a 20 70 61 67 65 73 20 28 69 46 69 72 73 74 2e  * pages (iFirst.
20110 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67  .MIN(nPage,nHPag
20120 65 29 29 20 74 6f 20 28 4d 41 58 28 6e 50 61 67  e)) to (MAX(nPag
20130 65 2c 6e 48 50 61 67 65 29 2b 31 29 2e 0a 20 20  e,nHPage)+1)..  
20140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
20150 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20 4d 49   Pgno iLast = MI
20160 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29  N(nPage, nHPage)
20170 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67  ;    /* Last pag
20180 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 20  e to move */.   
20190 20 20 20 20 20 50 67 6e 6f 20 69 50 67 3b 0a 0a       Pgno iPg;..
201a0 20 20 20 20 20 20 20 20 6e 46 69 6e 61 6c 20 3d          nFinal =
201b0 20 4d 41 58 28 6e 50 61 67 65 2c 20 6e 48 50 61   MAX(nPage, nHPa
201c0 67 65 29 3b 20 20 20 2f 2a 20 46 69 6e 61 6c 20  ge);   /* Final 
201d0 73 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  size of database
201e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
201f0 69 50 67 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74  iPg=pMap->iFirst
20200 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20 26 26 20  ; iPg<=iLast && 
20210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
20220 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
20230 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
20240 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  0;.          Pgn
20250 6f 20 69 4e 65 77 3b 20 20 20 20 20 20 20 20 20  o iNew;         
20260 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 67 65       /* New page
20270 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
20280 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50 74 72  */.          Ptr
20290 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  mapEntry *pEntry
202a0 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
202b0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
202c0 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20 20 20  ge iPg */..     
202d0 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
202e0 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
202f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
20300 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
20310 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
20320 70 50 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  pPg->pDbPage) );
20330 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
20340 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
20350 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 2d  ageRefcount(pPg-
20360 3e 70 44 62 50 61 67 65 29 3d 3d 31 20 29 3b 0a  >pDbPage)==1 );.
20370 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
20380 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b 69   = &pMap->aPtr[i
20390 50 67 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73  Pg - pMap->iFirs
203a0 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  t];.          iN
203b0 65 77 20 3d 20 2b 2b 6e 46 69 6e 61 6c 3b 0a 0a  ew = ++nFinal;..
203c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
203d0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
203e0 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54   pPg, pEntry->eT
203f0 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72  ype, pEntry->par
20400 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a 20  ent, iNew, 1);. 
20410 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
20420 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  PageNotNull(pPg)
20430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
20440 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20450 31 5b 32 38 5d 2c 20 6e 46 69 6e 61 6c 29 3b 0a  1[28], nFinal);.
20460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20470 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
20480 74 44 62 73 69 7a 65 28 70 50 61 67 65 72 2c 20  tDbsize(pPager, 
20490 6e 46 69 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20  nFinal);.  }..  
204a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
204b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
204c0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
204d0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
204e0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
204f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
20500 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
20510 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
20520 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
20530 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
20540 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
20550 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
20560 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
20570 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
20580 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
20590 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
205a0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
205b0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
205c0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
205d0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
205e0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
205f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
20600 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
20610 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
20620 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
20630 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
20640 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
20650 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
20660 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
20670 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
20680 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
20690 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
206a0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
206b0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
206c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
206d0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
206e0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
206f0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
20700 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
20710 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
20720 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
20730 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
20740 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
20750 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
20760 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
20770 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
20780 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
20790 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
207a0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
207b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
207c0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
207d0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
207e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
207f0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
20800 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
20810 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
20820 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
20830 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
20840 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
20850 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
20860 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
20870 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
20880 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
20890 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
208a0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
208b0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
208c0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
208d0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
208e0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
208f0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
20900 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
20910 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
20920 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
20930 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
20940 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
20950 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
20960 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
20970 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
20980 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
20990 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
209a0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
209b0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
209c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
209d0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
209e0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
209f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
20a00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20a10 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
20a20 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
20a30 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
20a40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20a50 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
20a60 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
20a70 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
20a80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20a90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
20aa0 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66  eeEnter(p);..#if
20ab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20ac0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20ad0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
20ae0 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
20af0 74 20 6f 66 20 61 6e 20 55 4e 4c 4f 43 4b 45 44  t of an UNLOCKED
20b00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
20b10 74 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  t .    ** requir
20b20 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 75 70  es a snapshot up
20b30 67 72 61 64 65 2e 20 49 66 20 73 6f 2c 20 73 6b  grade. If so, sk
20b40 69 70 20 61 6e 79 20 61 75 74 6f 2d 76 61 63 75  ip any auto-vacu
20b50 75 6d 20 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  um .    ** proce
20b60 73 73 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 69  ssing.  */.    i
20b70 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
20b80 75 6d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  um ){.      asse
20b90 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
20ba0 49 73 55 6e 6c 6f 63 6b 65 64 28 70 42 74 2d 3e  IsUnlocked(pBt->
20bb0 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
20bc0 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
20bd0 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
20be0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20c00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
20c10 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
20c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20c30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
20c40 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  ( pBt->bDoTrunca
20c50 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
20c60 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
20c70 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
20c80 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  r, pBt->nPage);.
20c90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20ca0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20cb0 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61 67  OK && sqlite3Pag
20cc0 65 72 49 73 55 6e 6c 6f 63 6b 65 64 28 70 42 74  erIsUnlocked(pBt
20cd0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
20ce0 20 20 20 72 63 20 3d 20 62 74 72 65 65 46 69 78     rc = btreeFix
20cf0 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20  Unlocked(p);.   
20d00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
20d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20d20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20d30 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
20d40 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
20d50 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
20d60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
20d70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
20d80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20d90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20da0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
20db0 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
20dc0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
20dd0 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
20de0 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
20df0 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
20e00 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
20e10 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
20e20 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
20e30 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
20e40 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
20e50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20e60 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
20e70 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
20e80 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
20e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20ea0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
20eb0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
20ec0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
20ed0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
20ee0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
20ef0 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
20f00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
20f10 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
20f20 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
20f30 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
20f40 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
20f50 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
20f60 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
20f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
20f80 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
20f90 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
20fa0 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
20fb0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20fc0 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
20fd0 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
20fe0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
20ff0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
21000 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
21010 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
21020 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
21030 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
21040 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
21050 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
21060 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
21070 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
21080 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
21090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
210a0 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
210b0 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
210c0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
210d0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
210e0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
210f0 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
21100 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
21110 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
21120 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
21130 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
21140 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
21150 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
21160 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
21170 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
21180 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
21190 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
211a0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
211b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
211c0 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
211d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
211e0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
211f0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
21200 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
21210 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
21220 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
21230 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
21240 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
21250 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
21260 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
21270 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
21280 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
21290 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
212a0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
212b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
212c0 20 61 6e 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61   an UNLOCKED tra
212d0 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65  nsaction, delete
212e0 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f   the pBt->pMap o
212f0 62 6a 65 63 74 20 2a 2f 0a 20 20 64 65 6c 65 74  bject */.  delet
21300 65 50 74 72 6d 61 70 28 70 42 74 29 3b 0a 20 20  ePtrmap(pBt);.  
21310 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
21320 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
21330 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
21340 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
21350 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
21360 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
21370 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
21380 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
21390 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
213a0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
213b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
213c0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
213d0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
213e0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
213f0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
21400 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
21410 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
21420 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
21430 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
21440 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
21450 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
21460 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
21470 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
21480 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
21490 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
214a0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
214b0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
214c0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
214d0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
214e0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
214f0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
21500 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
21510 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
21520 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
21530 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
21540 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
21550 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
21560 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
21570 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
21580 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
21590 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
215a0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
215b0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
215c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
215d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
215e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
215f0 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
21600 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
21610 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
21620 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
21630 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
21640 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
21650 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
21660 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
21670 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
21680 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
21690 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
216a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
216b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
216c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
216d0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
216e0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
216f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
21700 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
21710 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
21720 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
21730 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
21740 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
21750 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
21760 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
21770 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
21780 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
21790 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
217a0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
217b0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
217c0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
217d0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
217e0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
217f0 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
21800 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
21810 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
21820 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
21830 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
21840 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
21850 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
21860 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
21870 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
21880 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
21890 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
218a0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
218b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
218c0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
218d0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
218e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
218f0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
21900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21910 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21920 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
21930 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
21940 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
21950 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
21960 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
21970 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
21980 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
21990 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
219a0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
219b0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
219c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
219d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
219e0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
219f0 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
21a00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21a10 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
21a20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
21a30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
21a40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
21a50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
21a60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21a70 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
21a80 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
21a90 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
21aa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
21ab0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
21ac0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21ad0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
21ae0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21af0 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
21b00 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
21b10 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
21b20 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
21b30 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
21b40 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
21b50 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
21b60 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
21b70 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
21b80 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
21b90 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
21ba0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
21bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21bc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
21bd0 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
21be0 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
21bf0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
21c00 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
21c10 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
21c20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
21c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21c40 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
21c50 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
21c60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21c80 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
21c90 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
21ca0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21cb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21cc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21cd0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
21ce0 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
21cf0 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
21d00 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
21d10 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
21d20 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
21d30 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
21d40 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
21d50 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
21d60 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
21d70 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
21d80 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
21d90 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
21da0 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
21db0 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
21dc0 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
21dd0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
21de0 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
21df0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
21e00 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
21e10 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
21e20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
21e30 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
21e40 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
21e50 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
21e60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21e70 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
21e80 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
21e90 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
21ea0 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
21eb0 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
21ec0 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
21ed0 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
21ee0 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
21ef0 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
21f00 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
21f10 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
21f20 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
21f30 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
21f40 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
21f50 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
21f60 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
21f70 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
21f80 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
21f90 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
21fa0 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
21fb0 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
21fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
21fd0 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
21fe0 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
21ff0 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
22000 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
22010 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
22020 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
22030 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
22040 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
22050 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
22060 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
22070 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
22080 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
22090 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
220a0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
220b0 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
220c0 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
220d0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
220e0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
220f0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
22100 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
22110 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
22120 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
22130 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
22140 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
22150 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
22160 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
22170 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
22180 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
22190 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
221a0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
221b0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
221c0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
221d0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
221e0 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
221f0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
22200 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22210 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
22220 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
22230 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
22240 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
22250 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
22260 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
22270 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22280 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
22290 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
222a0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
222b0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
222c0 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77  t i;.      if( w
222d0 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e  riteOnly && (p->
222e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
222f0 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b  WriteFlag)==0 ){
22300 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
22310 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22320 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74  ALID || p->eStat
22330 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
22340 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
22350 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
22360 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
22370 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22390 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
223a0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
223b0 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20  Cursors(pBtree, 
223c0 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rc, 0);.        
223d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
223e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
223f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22400 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
22410 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
22420 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  ;.        p->eSt
22430 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
22440 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  LT;.        p->s
22450 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
22460 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
22470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
22480 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
22490 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
224a0 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
224b0 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67          p->apPag
224c0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[i] = 0;.      
224d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
224e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
224f0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
22500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22510 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
22520 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
22530 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
22540 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
22550 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
22560 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
22570 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
22580 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
22590 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
225a0 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
225b0 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
225c0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
225d0 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
225e0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
225f0 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
22600 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
22610 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
22620 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
22630 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
22640 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
22650 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
22660 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22670 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
22680 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
22690 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
226a0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
226b0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
226c0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
226d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
226e0 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
226f0 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
22700 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
22710 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
22720 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
22730 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
22740 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
22750 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
22760 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
22770 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
22780 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
22790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
227a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
227b0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
227c0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
227d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
227e0 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
227f0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
22800 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
22810 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
22820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
22830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22840 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
22850 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
22860 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
22870 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
22880 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
22890 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
228a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
228b0 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
228c0 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
228d0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
228e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
228f0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
22900 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
22910 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
22920 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
22930 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
22940 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
22950 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
22960 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
22970 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
22980 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
22990 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
229a0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
229b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
229c0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
229d0 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
229e0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
229f0 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
22a00 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
22a10 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
22a20 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
22a30 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
22a40 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
22a50 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
22a60 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
22a70 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
22a80 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
22a90 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
22aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22ab0 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
22ac0 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
22ad0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
22ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
22af0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
22b00 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
22b10 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
22b20 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
22b30 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
22b40 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
22b50 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
22b60 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
22b70 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
22b80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
22b90 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
22ba0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
22bb0 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
22bc0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
22bd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
22be0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
22bf0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
22c00 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
22c10 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
22c20 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
22c30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22c40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22c50 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
22c60 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
22c70 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
22c80 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
22c90 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
22ca0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
22cb0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
22cc0 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
22cd0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
22ce0 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
22cf0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
22d00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
22d10 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
22d20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
22d30 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
22d40 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
22d50 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
22d60 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
22d70 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
22d80 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
22d90 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
22da0 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
22db0 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
22dc0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
22dd0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
22de0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
22df0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
22e00 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
22e10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22e20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
22e30 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
22e40 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
22e50 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
22e60 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
22e70 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
22e80 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22e90 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
22ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
22eb0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
22ec0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
22ed0 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
22ee0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
22ef0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
22f00 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
22f10 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
22f20 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
22f30 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
22f40 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
22f50 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
22f60 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
22f70 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
22f80 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
22f90 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
22fa0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
22fb0 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
22fc0 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
22fd0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
22fe0 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
22ff0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
23000 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
23010 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
23020 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
23030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23040 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
23050 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
23060 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
23070 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
23080 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
23090 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
230a0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
230b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
230c0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
230d0 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
230e0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
230f0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
23100 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
23110 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
23120 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
23130 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
23140 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
23150 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
23160 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
23170 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
23180 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
23190 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
231a0 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
231b0 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
231c0 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
231d0 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
231e0 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
231f0 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
23200 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
23210 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
23220 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
23230 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
23240 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
23250 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
23260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
23270 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
23280 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
23290 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
232a0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
232b0 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
232c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
232d0 54 45 5f 4f 4b 20 26 26 20 70 42 74 2d 3e 70 4d  TE_OK && pBt->pM
232e0 61 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  ap ){.    rc = b
232f0 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28  treePtrmapBegin(
23300 70 42 74 2d 3e 70 4d 61 70 2c 20 69 53 74 61 74  pBt->pMap, iStat
23310 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ement);.  }.  sq
23320 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23330 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
23340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
23350 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
23360 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
23370 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
23380 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23390 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
233a0 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
233b0 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
233c0 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
233d0 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
233e0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
233f0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
23400 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
23410 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
23420 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
23430 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
23440 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
23450 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
23460 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
23470 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
23480 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23490 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
234a0 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
234b0 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
234c0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
234d0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
234e0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
234f0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
23500 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
23510 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
23520 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
23530 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
23540 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
23550 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
23560 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
23570 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
23580 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
23590 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
235a0 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
235b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
235c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
235d0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
235e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
235f0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
23600 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
23610 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
23620 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
23630 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
23640 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
23650 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
23660 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
23670 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
23680 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23690 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
236a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
236b0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61 70     if( pBt->pMap
236c0 20 29 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e   ) btreePtrmapEn
236d0 64 28 70 42 74 2d 3e 70 4d 61 70 2c 20 6f 70 2c  d(pBt->pMap, op,
236e0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
236f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23700 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
23710 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
23720 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
23730 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23740 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
23750 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
23760 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
23770 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
23780 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
23790 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
237a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
237b0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
237c0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
237d0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
237e0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
237f0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
23800 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23810 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
23820 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
23830 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
23840 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
23850 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
23860 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
23870 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
23880 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
23890 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
238a0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
238b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
238c0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
238d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
238e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
238f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23900 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
23910 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
23920 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
23930 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
23940 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
23950 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
23960 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
23970 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
23980 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
23990 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
239a0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
239b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
239c0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
239d0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
239e0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
239f0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
23a00 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
23a10 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
23a20 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
23a30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23a40 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
23a50 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
23a60 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
23a70 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
23a80 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
23a90 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
23aa0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
23ab0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
23ac0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
23ad0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
23ae0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
23af0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
23b00 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
23b10 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
23b20 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
23b30 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
23b40 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
23b50 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
23b60 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
23b70 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
23b80 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
23b90 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
23ba0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
23bb0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
23bc0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
23bd0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
23be0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
23bf0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
23c00 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
23c10 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
23c20 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
23c30 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
23c40 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
23c50 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
23c60 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
23c70 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
23c80 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
23c90 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
23ca0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
23cb0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
23cc0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
23cd0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
23ce0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
23cf0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
23d00 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
23d10 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
23d20 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
23d30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
23d40 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
23d50 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
23d60 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
23d70 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
23d80 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
23d90 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
23da0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
23db0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
23dc0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
23dd0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
23de0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
23df0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
23e00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23e10 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
23e20 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
23e30 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
23e40 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
23e50 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
23e60 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
23e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23e80 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
23e90 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
23ec0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
23ed0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ef0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
23f00 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
23f10 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f30 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
23f40 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
23f50 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
23f60 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
23f70 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
23f80 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
23f90 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
23fa0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
23fb0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fd0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
23fe0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
23ff0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
24000 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
24010 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
24020 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
24030 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58  /.  BtCursor *pX
24040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
24060 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72  oping over other
24070 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a   all cursors */.
24080 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24090 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
240a0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
240b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
240c0 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rFlag==1 );..  /
240d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
240e0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
240f0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
24100 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
24110 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
24120 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
24130 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
24140 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
24150 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
24160 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
24170 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
24180 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
24190 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
241a0 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
241b0 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
241c0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
241d0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
241e0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
241f0 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b  Info!=0, wrFlag+
24200 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
24210 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
24220 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
24230 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
24240 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
24250 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
24260 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
24270 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
24280 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
24290 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
242a0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
242b0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
242c0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
242d0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
242e0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
242f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
24300 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
24310 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
24320 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24330 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
24340 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
24350 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
24360 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
24370 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
24380 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
24390 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
243a0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
243b0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
243c0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
243d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
243e0 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
243f0 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
24400 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
24410 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
24420 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
24430 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
24440 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
24450 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
24460 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
24470 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
24480 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
24490 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
244a0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
244b0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
244c0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
244d0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
244e0 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
244f0 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
24500 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
24510 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42  ==0 || wrFlag==B
24520 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b  TCF_WriteFlag );
24530 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
24540 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  s = wrFlag;.  pC
24550 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
24560 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a  s = wrFlag ? 0 :
24570 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
24580 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65  NLY;.  /* If the
24590 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f  re are two or mo
245a0 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  re cursors on th
245b0 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68  e same btree, th
245c0 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a  en all such.  **
245d0 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20   cursors *must* 
245e0 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75  have the BTCF_Mu
245f0 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
24600 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74   */.  for(pX=pBt
24610 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70  ->pCursor; pX; p
24620 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
24630 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f    if( pX->pgnoRo
24640 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65  ot==(Pgno)iTable
24650 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75   ){.      pX->cu
24660 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
24670 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70  ultiple;.      p
24680 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
24690 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
246a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
246b0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
246c0 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70  Cursor;.  pBt->p
246d0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
246e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
246f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
24700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24710 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
24720 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
24730 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24760 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
24770 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
247a0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
247b0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
247c0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
247f0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
24800 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
24810 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
24820 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
24830 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
24840 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
24850 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
24860 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
24890 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
248a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
248b0 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20  iTable<1 ){.    
248c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
248d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  UPT_BKPT;.  }els
248e0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  e{.    sqlite3Bt
248f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
24900 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
24910 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
24920 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
24930 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cur);.    sqlite
24940 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
24950 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24970 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
24980 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
24990 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
249a0 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
249b0 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
249c0 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
249d0 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
249e0 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
249f0 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
24a00 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
24a10 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
24a20 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
24a30 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
24a40 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
24a50 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
24a60 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
24a70 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
24a80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24a90 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
24aa0 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  oid){.  return R
24ab0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43  OUND8(sizeof(BtC
24ac0 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ursor));.}../*.*
24ad0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
24ae0 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
24af0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
24b00 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
24b10 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d  t..**.** The sim
24b20 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72  ple approach her
24b30 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65  e would be to me
24b40 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72  mset() the entir
24b50 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a  e object.** to z
24b60 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72  ero.  But it tur
24b70 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  ns out that the 
24b80 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
24b90 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64  dx[] arrays.** d
24ba0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  o not need to be
24bb0 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79   zeroed and they
24bc0 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77   are large, so w
24bd0 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74  e can save a lot
24be0 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20  .** of run-time 
24bf0 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  by skipping the 
24c00 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
24c10 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73  f those elements
24c20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24c30 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
24c40 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
24c50 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66   memset(p, 0, of
24c60 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c  fsetof(BtCursor,
24c70 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a   iPage));.}../*.
24c80 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
24c90 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
24ca0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
24cb0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
24cc0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
24cd0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
24ce0 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
24cf0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
24d00 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
24d10 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
24d20 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
24d30 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
24d40 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
24d50 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
24d60 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
24d70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24d80 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
24d90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
24da0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
24db0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
24dc0 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  t->pCursor!=0 );
24dd0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43  .    if( pBt->pC
24de0 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20  ursor==pCur ){. 
24df0 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
24e00 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
24e10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24e20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65    BtCursor *pPre
24e30 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  v = pBt->pCursor
24e40 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
24e50 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70      if( pPrev->p
24e60 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20  Next==pCur ){.  
24e70 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70          pPrev->p
24e80 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
24e90 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  xt;.          br
24ea0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
24eb0 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70         pPrev = p
24ec0 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Prev->pNext;.   
24ed0 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59     }while( ALWAY
24ee0 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20  S(pPrev) );.    
24ef0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
24f00 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
24f10 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
24f20 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
24f30 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
24f40 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
24f50 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
24f60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
24f70 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
24f80 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
24f90 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
24fa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
24fb0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
24fc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24fd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
24fe0 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
24ff0 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
25000 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
25010 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
25020 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
25030 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
25040 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
25050 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
25060 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
25070 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
25080 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
25090 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
250a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
250b0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
250c0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
250d0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
250e0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
250f0 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
25100 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
25110 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
25120 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
25130 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
25140 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
25150 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
25160 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
25170 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
25180 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
25190 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
251a0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
251b0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
251c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
251d0 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
251e0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
251f0 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69  _DB || memcmp(&i
25200 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
25210 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
25220 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
25230 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
25240 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
25250 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  if.static SQLITE
25260 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67  _NOINLINE void g
25270 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
25280 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
25290 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
252a0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ze==0 ){.    int
252b0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
252c0 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Page;.    pCur->
252d0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
252e0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
252f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
25300 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
25310 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
25320 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
25330 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
25340 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
25350 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
25360 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
25370 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
25380 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
25390 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
253a0 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
253b0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
253c0 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
253d0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
253e0 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
253f0 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
25400 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
25410 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
25420 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
25430 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
25440 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
25450 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
25460 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
25470 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
25480 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25490 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
254a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
254b0 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
254c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
254d0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
254e0 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
254f0 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
25500 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
25510 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
25520 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
25530 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
25540 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
25550 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
25560 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
25570 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
25580 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
25590 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
255a0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
255b0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
255c0 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
255d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
255e0 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
255f0 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
25600 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
25610 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a   in the key..**.
25620 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
25630 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  st position the 
25640 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20  cursor prior to 
25650 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
25660 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  utine..** .** Th
25670 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
25680 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61  t fail.  It alwa
25690 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
256a0 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  E_OK.  .*/.int s
256b0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
256c0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
256d0 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
256e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
256f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25710 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25720 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
25730 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
25740 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
25750 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72  ->info.nKey;.  r
25760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
25780 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
25790 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
257a0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
257b0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
257c0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
257d0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
257e0 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
257f0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
25800 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
25810 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
25820 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
25830 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
25840 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
25850 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
25860 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
25870 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
25880 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
25890 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
258a0 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
258b0 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
258c0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
258d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
258e0 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
258f0 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
25900 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
25910 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
25920 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
25930 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
25940 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
25950 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
25960 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
25970 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
25980 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25990 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
259a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
259b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
259c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
259d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
259e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
259f0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
25a00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25a10 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
25a20 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
25a30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25a40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25a50 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61  Page]->intKeyLea
25a60 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c  f==1 );.  getCel
25a70 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
25a80 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
25a90 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72  fo.nPayload;.  r
25aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
25ac0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
25ad0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
25ae0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
25af0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
25b00 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
25b10 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
25b20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25b30 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
25b40 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
25b50 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
25b60 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
25b70 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
25b80 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
25b90 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
25ba0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
25bb0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
25bc0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
25bd0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
25be0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25bf0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
25c00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25c10 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
25c20 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
25c30 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
25c40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
25c50 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
25c60 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
25c70 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
25c80 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
25c90 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
25ca0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
25cb0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
25cc0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
25cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
25ce0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
25cf0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
25d00 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
25d10 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
25d20 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
25d30 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
25d40 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
25d50 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
25d60 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
25d70 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
25d80 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
25d90 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
25da0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
25db0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
25dc0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
25dd0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
25de0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
25df0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
25e00 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
25e10 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
25e20 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
25e30 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
25e40 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
25e50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
25e60 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
25e70 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
25e80 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
25e90 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
25ea0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
25eb0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
25ec0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
25ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
25ee0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
25ef0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
25f00 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
25f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25f20 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
25f30 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
25f40 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
25f50 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
25f60 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
25f70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
25f80 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
25f90 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
25fa0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
25fb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25fc0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25fd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25fe0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
25ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
26000 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
26010 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26020 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
26030 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
26040 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
26050 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
26060 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
26070 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
26080 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
26090 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
260a0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
260b0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
260c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
260d0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
260e0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
260f0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
26100 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
26110 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
26120 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
26130 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
26140 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
26150 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
26160 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
26170 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
26180 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
26190 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
261a0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
261b0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
261c0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
261d0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
261e0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
261f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
26200 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
26210 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
26220 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
26230 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
26240 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
26250 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
26260 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
26270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26280 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
26290 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
262a0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
262b0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
262c0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
262d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
262e0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
262f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
26300 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
26310 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
26320 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
26330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26340 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
26350 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
26360 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
26370 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
26380 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
26390 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
263a0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
263b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
263c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
263d0 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
263e0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
263f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26400 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
26410 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
26420 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
26430 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
26440 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
26450 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
26460 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
26470 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
26480 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
26490 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
264a0 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
264b0 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
264c0 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
264d0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
264e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
264f0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
26500 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
26510 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
26520 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
26530 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
26540 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
26550 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
26560 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
26570 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
26580 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
26590 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
265a0 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
265b0 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
265c0 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
265d0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
265e0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
265f0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
26600 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
26610 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
26620 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26630 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
26640 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
26650 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
26660 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
26670 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
26680 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
26690 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
266a0 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
266b0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
266c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
266d0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
266e0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
266f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26700 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
26710 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26730 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
26740 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
26750 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
26760 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
26770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26780 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
26790 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
267a0 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
267b0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
267c0 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
267d0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
267e0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
267f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26800 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
26810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
26830 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
26840 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
26850 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
26860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26870 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
26880 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
26890 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
268a0 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
268b0 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
268c0 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
268d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
268e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
268f0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
26900 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
26910 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
26920 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
26930 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
26940 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
26950 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
26960 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
26970 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
26980 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
26990 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
269a0 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
269b0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
269c0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
269d0 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
269e0 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
269f0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
26a00 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
26a10 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69    2: The operati
26a20 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f  on is a read. Do
26a30 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
26a40 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
26a50 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
26a60 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
26a70 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
26a80 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
26a90 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
26aa0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
26ab0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
26ac0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
26ad0 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
26ae0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
26af0 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
26b00 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
26b10 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
26b20 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
26b30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
26b40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
26b50 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
26b60 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
26b70 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
26b80 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20   and the.** eOp 
26b90 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
26ba0 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  2, this function
26bb0 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
26bc0 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
26bd0 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73  ly .** populates
26be0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
26bf0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
26c00 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
26c10 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
26c20 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
26c30 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
26c40 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
26c50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
26c60 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
26c70 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
26c80 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
26c90 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
26ca0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
26cb0 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
26cc0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
26cd0 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
26ce0 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
26cf0 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
26d00 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
26d10 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
26d20 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
26d30 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
26d40 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
26d50 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
26d60 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
26d70 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
26d80 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
26d90 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
26da0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
26db0 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
26dc0 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
26dd0 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
26de0 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
26df0 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
26e00 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
26e10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
26e20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
26e30 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
26e40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
26e50 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
26e60 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
26e70 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
26e80 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
26e90 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
26ea0 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
26eb0 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
26ec0 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
26ed0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
26ee0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
26ef0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
26f00 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
26f10 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
26f20 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
26f30 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
26f40 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
26f50 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
26f60 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
26f70 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
26f80 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
26f90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26fa0 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  OK;.  int iIdx =
26fb0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
26fc0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26fd0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26fe0 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
26ff0 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
27000 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
27010 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
27040 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
27050 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
27060 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
27070 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e  OW_READ.  unsign
27080 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
27090 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66  pBufStart = pBuf
270a0 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20  ;.  int bEnd;   
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
270d0 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
270e0 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20   to end of data 
270f0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
27100 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
27110 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27120 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27130 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
27140 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27150 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
27160 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
27170 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27180 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27190 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c  ssert( eOp!=2 ||
271a0 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20   offset==0 );   
271b0 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74   /* Always start
271c0 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
271d0 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20  for eOp==2 */.. 
271e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
271f0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
27200 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
27210 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c  load;.#ifdef SQL
27220 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
27230 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
27240 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43  = offset+amt==pC
27250 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
27260 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  d;.#endif.  asse
27270 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
27280 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
27290 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20  yload );..  if( 
272a0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
272b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
272c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
272d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
272e0 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
272f0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
27300 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
27310 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
27320 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
27330 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27340 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
27350 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
27360 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
27370 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
27380 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
27390 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
273a0 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
273b0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
273c0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
273d0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
273e0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
273f0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
27400 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
27410 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
27420 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
27430 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
27440 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  t], pBuf, a, (eO
27450 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65  p & 0x01), pPage
27460 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
27470 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
27480 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
27490 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
274a0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
274b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
274c0 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  l;.  }...  if( r
274d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
274e0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
274f0 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
27500 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
27510 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
27520 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
27530 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
27540 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
27550 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
27560 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
27570 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27580 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
27590 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
275a0 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
275b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
275c0 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
275d0 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
275e0 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   do not allocate
275f0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72   aOverflow[] for
27600 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a   eOp==2..    **.
27610 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
27620 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
27630 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
27640 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
27650 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
27660 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
27670 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
27680 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
27690 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
276a0 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
276b0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
276c0 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
276d0 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
276e0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
276f0 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
27700 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
27710 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
27720 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
27730 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
27740 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75  !=2 && (pCur->cu
27750 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
27760 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
27770 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
27780 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
27790 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
277a0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
277b0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
277c0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
277d0 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
277e0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
277f0 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
27800 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
27810 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
27820 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
27830 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
27840 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27850 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
27860 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
27870 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27880 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27890 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
278a0 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
278b0 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
278c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
278d0 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
278e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
278f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27900 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
27910 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
27920 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
27930 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
27940 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
27950 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
27960 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vfl;.      }.   
27970 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
27980 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
27990 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
279a0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
279b0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
279c0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
279d0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
279e0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
279f0 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
27a00 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
27a10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
27a20 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
27a30 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d  TCF_ValidOvfl)!=
27a40 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  0.     && pCur->
27a50 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
27a60 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29  /ovflSize].    )
27a70 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
27a80 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
27a90 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
27aa0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
27ab0 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
27ac0 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
27ad0 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
27ae0 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  }..    for( ; rc
27af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
27b00 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
27b10 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20  ; iIdx++){..    
27b20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
27b30 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
27b40 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
27b50 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
27b60 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
27b70 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
27b80 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20  idOvfl)!=0 ){.  
27b90 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
27ba0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27bb0 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
27bc0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
27bd0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
27be0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27bf0 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
27c00 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
27c10 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
27c20 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
27c30 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
27c40 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
27c50 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
27c60 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
27c70 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
27c80 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
27c90 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
27ca0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
27cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
27cc0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
27cd0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
27ce0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
27cf0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
27d00 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27d10 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
27d20 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
27d30 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
27d40 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
27d50 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
27d60 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
27d70 65 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72  e that the aOver
27d80 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73  flow[] array mus
27d90 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62  t be allocated b
27da0 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20  ecause eOp!=2.  
27db0 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20        ** here.  
27dc0 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20  If eOp==2, then 
27dd0 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68  offset==0 and th
27de0 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76  is branch is nev
27df0 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20  er taken..      
27e00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
27e10 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20  ert( eOp!=2 );. 
27e20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
27e30 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
27e40 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29  BTCF_ValidOvfl )
27e50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27e60 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  ( pCur->pBtree->
27e70 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20  db==pBt->db );. 
27e80 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
27e90 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
27ea0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
27eb0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
27ec0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
27ed0 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1];.        }els
27ee0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
27ef0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
27f00 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
27f10 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
27f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27f30 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
27f40 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
27f50 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
27f60 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
27f70 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
27f80 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
27f90 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
27fa0 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
27fb0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
27fc0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
27fd0 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
27fe0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
27ff0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
28000 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
28010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
28020 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a  ile *fd;.#endif.
28030 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
28040 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
28050 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
28060 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
28070 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
28080 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
28090 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
280a0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
280b0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
280c0 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
280d0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
280e0 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
280f0 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
28100 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
28110 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
28120 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
28130 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
28140 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
28150 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
28160 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
28170 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61  **   3) the data
28180 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
28190 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
281a0 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69   **   4) there i
281b0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
281c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
281d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
281e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
281f0 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62   not a WAL datab
28200 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase,.        ** 
28210 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72    6) all data fr
28220 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62  om the page is b
28230 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20  eing read..     
28240 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65     **   7) at le
28250 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65  ast 4 bytes have
28260 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
28270 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ad into the outp
28280 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20  ut buffer .     
28290 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
282a0 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
282b0 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
282c0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
282d0 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
282e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
282f0 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
28300 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
28310 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
28320 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
28330 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
28340 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
28350 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
28360 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
28370 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28380 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d   if( (eOp&0x01)=
28390 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
283c0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
283d0 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
28410 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20      && (bEnd || 
28420 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20  a==ovflSize)    
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
28450 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
28460 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
28470 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20  on==TRANS_READ  
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
284a0 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73        && (fd = s
284b0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
284c0 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70  pBt->pPager))->p
284d0 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28  Methods     /* (
284e0 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
284f0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
28500 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20  Data[19]==0x01  
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20       /* (5) */. 
28530 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
28540 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28570 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (7) */.        
28580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
28590 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20  aSave[4];.      
285a0 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d      u8 *aWrite =
285b0 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20   &pBuf[-4];.    
285c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57        assert( aW
285d0 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20  rite>=pBufStart 
285e0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
285f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65             /* he
28600 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20  nce (7) */.     
28610 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
28620 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
28630 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28640 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
28650 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
28660 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
28670 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
28680 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
28690 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
286a0 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
286b0 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
286c0 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
286d0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
286e0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
286f0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
28700 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
28710 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28720 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
28730 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
28740 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
28750 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30         ((eOp&0x0
28760 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  1)==0 ? PAGER_GE
28770 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
28780 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
28790 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
287a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
287b0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
287c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
287d0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
287e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
287f0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
28800 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
28810 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
28820 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
28830 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
28840 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31  uf, a, (eOp&0x01
28850 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ), pDbPage);.   
28860 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28870 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
28880 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
28890 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
288a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
288b0 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
288c0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
288d0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
288e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
288f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28900 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
28910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28920 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
28930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28940 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
28950 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
28960 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
28970 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
28980 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
28990 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
289a0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
289b0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
289c0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
289d0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
289e0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
289f0 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
28a00 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
28a10 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
28a20 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
28a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
28a40 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
28a50 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
28a60 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
28a70 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
28a80 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
28a90 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
28aa0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
28ab0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
28ac0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
28ad0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
28ae0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
28af0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
28b00 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
28b10 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
28b20 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
28b30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28b40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28b50 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
28b60 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
28b70 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
28b80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
28b90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28ba0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28bb0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
28bc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28bd0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
28be0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
28bf0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
28c00 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
28c10 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
28c20 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
28c30 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
28c40 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
28c50 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
28c60 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
28c70 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
28c80 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
28c90 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
28ca0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
28cb0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
28cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
28cd0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
28ce0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
28cf0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
28d00 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
28d10 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
28d20 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
28d30 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
28d40 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
28d50 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
28d60 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
28d70 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
28d80 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
28d90 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
28da0 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
28db0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
28dc0 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
28dd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28de0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
28df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
28e00 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
28e10 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28e20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28e30 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
28e40 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
28e50 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
28e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
28e80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28e90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
28ea0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
28eb0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
28ec0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28ed0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
28ee0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
28ef0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
28f00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28f10 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
28f20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
28f30 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28f40 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
28f50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28f60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
28f70 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28f80 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
28f90 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
28fa0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
28fb0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
28fc0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
28fd0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
28fe0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
28ff0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
29000 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
29010 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
29020 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
29030 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
29040 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
29050 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
29060 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
29070 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
29080 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
29090 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
290a0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
290b0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
290c0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
290d0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
290e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
290f0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
29100 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
29110 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
29120 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
29130 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
29140 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
29150 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
29160 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
29170 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
29180 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
29190 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
291a0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
291b0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
291c0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
291d0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
291e0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
291f0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
29200 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
29210 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
29220 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
29230 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
29240 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
29250 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
29260 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
29270 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
29280 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
29290 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
292a0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
292b0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
292c0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
292d0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
292e0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
292f0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
29300 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
29310 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
29320 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
29330 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
29340 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
29350 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
29360 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
29370 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
29380 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
29390 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
293a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
293b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
293c0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
293d0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
293e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
293f0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
29400 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
29410 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29420 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
29430 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29440 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29460 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29470 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29480 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
29490 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
294a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
294b0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
294c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
294d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
294e0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
294f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29500 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b  >info.nSize>0 );
29510 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29520 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70  >info.pPayload>p
29530 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29540 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20  ->iPage]->aData 
29550 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
29560 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29570 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
29580 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29590 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45  ->iPage]->aDataE
295a0 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29  nd ||CORRUPT_DB)
295b0 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28  ;.  amt = (int)(
295c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
295d0 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
295e0 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  End - pCur->info
295f0 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66  .pPayload);.  if
29600 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  ( pCur->info.nLo
29610 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20  cal<amt ) amt = 
29620 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
29630 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74  l;.  *pAmt = amt
29640 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
29650 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
29660 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
29670 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
29680 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
29690 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
296a0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
296b0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
296c0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
296d0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
296e0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
296f0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
29700 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
29710 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
29720 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
29730 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
29740 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
29750 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
29760 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
29770 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
29780 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
29790 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
297a0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
297b0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
297c0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
297d0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
297e0 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
297f0 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
29800 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
29810 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
29820 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
29830 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
29840 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
29850 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
29860 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
29870 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
29880 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
29890 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
298a0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
298b0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
298c0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
298d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
298e0 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
298f0 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
29900 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
29910 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
29920 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
29930 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
29940 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
29950 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
29960 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
29970 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
29980 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
29990 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
299a0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
299b0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
299c0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
299d0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
299e0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
299f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
29a00 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
29a10 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
29a20 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
29a30 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
29a40 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
29a50 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
29a60 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
29a70 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
29a80 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
29a90 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
29aa0 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
29ab0 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
29ac0 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
29ad0 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
29ae0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
29af0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
29b00 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
29b10 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  o){.  BtShared *
29b20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
29b30 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29b40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
29b50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29b60 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29b70 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29b80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
29b90 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
29ba0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
29bb0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
29bc0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
29bd0 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
29be0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
29bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29c00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29c10 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  T;.  }.  pCur->i
29c20 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29c30 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29c40 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
29c50 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29c60 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  fl);.  pCur->iPa
29c70 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69  ge++;.  pCur->ai
29c80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29c90 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67   = 0;.  return g
29ca0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
29cb0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75  t, newPgno, &pCu
29cc0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29cd0 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50  pCur, pCur->curP
29d00 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23  agerFlags);.}..#
29d10 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
29d20 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
29d30 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
29d40 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
29d50 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
29d60 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
29d70 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
29d80 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
29d90 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
29da0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
29db0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
29dc0 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
29dd0 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
29de0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
29df0 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
29e00 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
29e10 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
29e20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
29e30 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
29e40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
29e50 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
29e60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
29e70 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
29e80 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
29e90 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
29ea0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
29eb0 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
29ec0 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
29ed0 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ef0 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
29f00 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
29f10 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
29f20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
29f30 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
29f40 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
29f50 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29f60 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
29f70 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
29f80 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
29f90 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
29fa0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29fb0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
29fc0 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
29fd0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
29fe0 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
29ff0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2a000 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
2a010 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2a020 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
2a030 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
2a040 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
2a050 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
2a060 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
2a070 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2a080 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2a090 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2a0a0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
2a0b0 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
2a0c0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
2a0d0 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
2a0e0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2a0f0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
2a100 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
2a110 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
2a120 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
2a130 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
2a140 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
2a150 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2a160 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2a170 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2a180 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2a190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a1a0 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
2a1b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2a1c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a1d0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
2a1e0 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
2a1f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a200 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
2a210 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a220 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2a230 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a240 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
2a250 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
2a260 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2a270 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
2a280 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a290 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
2a2a0 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
2a2b0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2a2c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a2d0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2a2e0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2a2f0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2a300 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
2a310 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a320 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  --]);.}../*.** M
2a330 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2a340 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
2a350 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
2a360 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2a370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
2a380 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
2a390 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
2a3a0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2a3b0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
2a3c0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
2a3d0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
2a3e0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
2a3f0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
2a400 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
2a410 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
2a420 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
2a430 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
2a440 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
2a450 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
2a460 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
2a470 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
2a480 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
2a490 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
2a4a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
2a4b0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
2a4c0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
2a4d0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2a4e0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
2a4f0 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
2a500 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
2a510 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
2a520 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
2a530 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
2a540 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
2a550 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
2a560 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2a570 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
2a580 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
2a590 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
2a5a0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
2a5b0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
2a5c0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
2a5d0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
2a5e0 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
2a5f0 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
2a600 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
2a610 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
2a620 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
2a630 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
2a640 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
2a650 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
2a660 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
2a670 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2a680 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
2a690 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
2a6a0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
2a6b0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
2a6c0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
2a6d0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
2a6e0 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
2a6f0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
2a700 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2a710 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2a720 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
2a730 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
2a740 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
2a750 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2a760 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
2a770 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2a780 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
2a790 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2a7a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2a7b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2a7c0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2a7d0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
2a7e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a7f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2a800 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
2a810 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2a820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2a830 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
2a840 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2a850 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
2a860 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
2a870 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
2a880 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2a890 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2a8a0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
2a8b0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2a8c0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
2a8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
2a8e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
2a8f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
2a900 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2a910 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
2a920 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2a930 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
2a940 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2a950 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a960 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a970 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  age]!=0 );.     
2a980 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2a990 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
2a9a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
2a9b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2a9c0 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
2a9d0 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
2a9e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a9f0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2aa00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2aa10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2aa20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2aa30 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  ge==(-1) );.    
2aa40 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2aa50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
2aa60 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2aa70 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
2aa80 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20  Page[0],.       
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67   0, pCur->curPag
2aab0 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  erFlags);.    if
2aac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2aad0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
2aae0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2aaf0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
2ab00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2ab10 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
2ab20 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
2ab30 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
2ab40 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2ab50 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  y;.  }.  pRoot =
2ab60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2ab70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
2ab80 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
2ab90 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
2aba0 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
2abb0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
2abc0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
2abd0 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
2abe0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
2abf0 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
2ac00 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
2ac10 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
2ac20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
2ac30 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
2ac40 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
2ac50 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
2ac60 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2ac70 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
2ac80 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
2ac90 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
2aca0 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
2acb0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2acc0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2acd0 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
2ace0 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
2acf0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
2ad00 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2ad10 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2ad20 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
2ad30 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
2ad40 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
2ad50 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
2ad60 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2ad70 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
2ad80 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
2ad90 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
2ada0 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
2adb0 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
2adc0 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
2add0 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
2ade0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
2adf0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
2ae00 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2ae10 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
2ae20 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
2ae30 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2ae40 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
2ae50 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2ae60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2ae70 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  KPT;.  }..  pCur
2ae80 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
2ae90 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2aea0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2aeb0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2aec0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2aed0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2aee0 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28  lidOvfl);..  if(
2aef0 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20   pRoot->nCell>0 
2af00 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2af10 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2af20 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
2af30 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
2af40 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
2af50 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
2af60 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
2af70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2af80 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
2af90 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
2afa0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
2afb0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
2afc0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
2afd0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2afe0 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
2aff0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
2b000 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
2b010 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2b020 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2b030 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ID;.  }.  return
2b040 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2b050 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2b060 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
2b070 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2b080 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
2b090 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
2b0a0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2b0b0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
2b0c0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2b0d0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2b0e0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
2b0f0 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
2b100 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2b110 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2b120 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
2b130 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2b140 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2b150 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b160 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2b170 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2b180 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2b190 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2b1a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b1b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2b1c0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
2b1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
2b1e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b1f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b200 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
2b210 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2b220 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b230 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2b240 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2b250 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2b260 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
2b270 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
2b280 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2b290 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2b2a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b2b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2b2c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2b2d0 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
2b2e0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2b2f0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
2b300 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
2b310 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2b320 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
2b330 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
2b340 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
2b350 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
2b360 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
2b370 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b380 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
2b390 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
2b3a0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
2b3b0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
2b3c0 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
2b3d0 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
2b3e0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2b3f0 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
2b400 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
2b410 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
2b420 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
2b430 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
2b440 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
2b450 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2b460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b470 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
2b480 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2b490 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2b4a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b4b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2b4c0 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
2b4d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2b4e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2b4f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b500 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b510 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
2b520 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b530 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b540 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
2b550 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2b560 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2b570 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2b580 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
2b590 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b5a0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
2b5b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2b5c0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2b5d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b5e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2b5f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b600 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
2b610 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73  e->nCell-1;.  as
2b620 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2b630 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61  .nSize==0 );.  a
2b640 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2b650 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2b660 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20  lidNKey)==0 );. 
2b670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b680 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  K;.}../* Move th
2b690 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2b6a0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2b6b0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2b6c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
2b6d0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
2b6e0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
2b6f0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
2b700 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
2b710 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
2b720 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
2b730 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2b740 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b750 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
2b760 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2b770 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2b780 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2b790 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2b7a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b7b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b7c0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2b7d0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2b7e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2b7f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2b800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b810 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2b820 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2b830 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
2b840 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2b850 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2b860 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b870 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2b880 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2b890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b8a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b8b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b8c0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
2b8d0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2b8e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
2b8f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2b900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2b910 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2b920 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2b930 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2b940 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2b950 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2b960 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2b970 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2b980 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2b990 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2b9a0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2b9b0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2b9c0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2b9d0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2b9e0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
2b9f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2ba00 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2ba10 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
2ba20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2ba30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2ba40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ba50 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2ba60 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2ba70 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2ba80 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
2ba90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
2baa0 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
2bab0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
2bac0 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
2bad0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2bae0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2baf0 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2bb00 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
2bb10 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2bb20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
2bb30 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
2bb40 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2bb50 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
2bb60 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
2bb70 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2bb80 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
2bb90 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
2bba0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
2bbb0 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
2bbc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2bbd0 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
2bbe0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
2bbf0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
2bc00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2bc10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2bc20 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
2bc30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2bc40 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2bc50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2bc60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bc70 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
2bc80 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
2bc90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
2bca0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2bcb0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2bcc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bcd0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2bce0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2bcf0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
2bd00 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2bd10 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2bd20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bd30 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2bd40 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2bd50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bd60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2bd70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2bd80 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
2bd90 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
2bda0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2bdb0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
2bdc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bdd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
2bde0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2bdf0 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
2be00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2be10 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2be20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
2be30 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
2be40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2be50 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2be60 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2be70 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2be80 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2be90 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2bea0 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2beb0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2bec0 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2bed0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2bee0 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2bef0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2bf00 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2bf10 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2bf20 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2bf30 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2bf40 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2bf50 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2bf60 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2bf70 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2bf80 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2bf90 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2bfa0 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2bfb0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2bfc0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2bfd0 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2bfe0 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2bff0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2c000 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2c010 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2c020 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2c030 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2c040 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2c050 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2c060 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2c070 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2c080 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2c090 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2c0a0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2c0b0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2c0c0 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2c0d0 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2c0e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2c0f0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2c100 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2c110 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2c120 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2c130 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c140 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2c160 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2c170 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2c180 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c190 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2c1a0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2c1b0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2c1c0 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2c1d0 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2c1e0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2c1f0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c200 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c210 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c230 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2c240 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2c250 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2c260 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2c270 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2c280 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2c290 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2c2b0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2c2c0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2c2d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2c2e0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
2c2f0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2c300 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
2c310 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
2c320 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
2c330 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
2c340 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
2c350 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
2c360 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
2c370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c380 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
2c390 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
2c3a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2c3b0 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
2c3c0 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
2c3d0 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
2c3e0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
2c3f0 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
2c400 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
2c410 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2c420 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
2c430 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
2c440 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2c450 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2c460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2c470 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c480 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2c490 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
2c4a0 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
2c4b0 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
2c4c0 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
2c4d0 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
2c4e0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2c4f0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
2c500 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
2c510 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
2c520 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
2c530 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
2c540 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
2c550 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
2c560 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2c570 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c580 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2c590 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2c5a0 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43  Key)!=0.   && pC
2c5b0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20  ur->curIntKey . 
2c5c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2c5d0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2c5e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
2c5f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
2c600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
2c620 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2c630 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2c640 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
2c650 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2c660 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2c670 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c680 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2c690 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
2c6a0 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
2c6b0 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
2c6c0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
2c6d0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
2c6e0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
2c6f0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
2c700 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2c710 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
2c720 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2c730 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
2c740 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2c750 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
2c760 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2c770 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2c780 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
2c790 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
2c7a0 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
2c7b0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2c7c0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2c7d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c7e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c7f0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2c800 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c810 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
2c820 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2c830 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2c840 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c850 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
2c860 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c870 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2c880 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
2c890 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c8a0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2c8b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2c8c0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2c8d0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
2c8e0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
2c8f0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2c900 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2c910 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2c920 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2c930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c940 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
2c950 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
2c960 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d  ]->intKey==pCur-
2c970 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
2c980 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
2c990 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  rIntKey || pIdxK
2c9a0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
2c9b0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
2c9c0 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50  r, idx, c;.    P
2c9d0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
2c9e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2c9f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ca00 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2ca10 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca30 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ca40 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
2ca50 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
2ca60 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
2ca70 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
2ca80 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
2ca90 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
2caa0 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
2cab0 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
2cac0 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
2cad0 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
2cae0 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
2caf0 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
2cb00 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
2cb10 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
2cb20 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
2cb30 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
2cb40 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2cb50 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
2cb60 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
2cb70 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
2cb80 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
2cb90 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
2cba0 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
2cbb0 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
2cbc0 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
2cbd0 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
2cbe0 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
2cbf0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
2cc00 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
2cc10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2cc20 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2cc30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2cc40 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
2cc50 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
2cc60 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
2cc70 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
2cc80 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  1;.    assert( b
2cc90 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62  iasRight==0 || b
2cca0 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20  iasRight==1 );. 
2ccb0 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31     idx = upr>>(1
2ccc0 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20  -biasRight); /* 
2ccd0 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20  idx = biasRight 
2cce0 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72  ? upr : (lwr+upr
2ccf0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72  )/2; */.    pCur
2cd00 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2cd10 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2cd20 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64  .    if( xRecord
2cd30 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
2cd40 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2cd50 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
2cd60 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
2cd70 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2cd80 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2cd90 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2cda0 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
2cdb0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2cdc0 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
2cdd0 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
2cde0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
2cdf0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2ce00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2ce10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2ce20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ce30 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2ce40 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2ce50 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2ce60 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2ce70 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2ce80 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2ce90 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2cea0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2ceb0 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2cec0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2ced0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2cee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2cef0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2cf00 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2cf10 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2cf20 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2cf30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2cf40 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2cf50 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2cf60 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2cf70 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2cf80 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
2cf90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
2cfa0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2cfb0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2cfc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2cfd0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2cfe0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2cff0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2d000 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2d010 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2d020 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2d030 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2d040 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d050 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2d060 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d070 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d080 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2d090 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2d0a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d0b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2d0c0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2d0d0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2d0e0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2d0f0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2d100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2d110 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2d120 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2d130 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2d140 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2d150 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2d160 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2d170 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2d180 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
2d190 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2d1a0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
2d1b0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
2d1c0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
2d1d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2d1e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2d1f0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
2d200 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
2d210 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
2d220 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
2d230 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
2d240 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
2d250 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
2d260 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
2d270 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
2d280 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
2d290 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
2d2a0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
2d2b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2d2c0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
2d2d0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
2d2e0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
2d2f0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
2d300 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
2d310 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
2d320 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
2d330 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
2d340 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
2d350 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
2d360 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2d370 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
2d380 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
2d390 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
2d3a0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
2d3b0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2d3c0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
2d3d0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
2d3e0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
2d3f0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
2d400 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
2d410 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2d420 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
2d430 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2d440 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
2d450 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
2d460 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2d470 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2d480 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
2d490 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2d4a0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2d4b0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2d4c0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
2d4d0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2d4e0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
2d4f0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
2d500 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
2d510 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
2d520 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
2d530 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
2d540 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
2d550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d560 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2d570 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
2d580 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2d590 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
2d5a0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
2d5b0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
2d5c0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2d5d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d5e0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
2d5f0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2d600 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2d610 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2d620 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2d630 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
2d640 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2d650 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2d660 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
2d670 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
2d680 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2d690 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
2d6a0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
2d6b0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
2d6c0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
2d6d0 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
2d6e0 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
2d6f0 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
2d700 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
2d710 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
2d720 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
2d730 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
2d740 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
2d750 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
2d760 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
2d770 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2d780 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
2d790 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
2d7a0 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
2d7b0 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
2d7c0 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
2d7d0 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
2d7e0 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
2d7f0 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
2d800 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
2d810 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
2d820 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
2d830 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
2d840 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
2d850 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2d860 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
2d870 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2d880 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
2d890 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
2d8a0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
2d8b0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
2d8c0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
2d8d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2d8e0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
2d8f0 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
2d900 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
2d910 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
2d920 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
2d930 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
2d940 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
2d950 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
2d960 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
2d970 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
2d980 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2d990 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
2d9a0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2d9b0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
2d9c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2d9d0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
2d9e0 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2d9f0 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2da00 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
2da10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2da20 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
2da30 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
2da40 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
2da50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2da60 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20  Cell<2 ){.      
2da70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2da80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2da90 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2daa0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2dab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dac0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
2dad0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2dae0 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
2daf0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
2db00 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
2db10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2db20 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2db30 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2db40 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2db50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2db60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2db70 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2db80 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2db90 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2dba0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2dbb0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2dbc0 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20  pCellKey, 2);.  
2dbd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2dbe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2dbf0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2dc00 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2dc10 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2dc20 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2dc30 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
2dc40 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2dc50 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2dc60 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2dc70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2dc80 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2dc90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2dca0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2dcb0 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2dcc0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2dcd0 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2dce0 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2dcf0 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2dd00 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2dd10 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2dd20 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2dd30 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2dd40 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2dd50 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2dd60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2dd70 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2dd80 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2dd90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2dda0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2ddb0 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2ddc0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2ddd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2dde0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ddf0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2de00 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2de10 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2de20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2de30 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2de40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2de50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2de60 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2de70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2de80 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2de90 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2dea0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2deb0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2dec0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2ded0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2dee0 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2def0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2df00 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2df10 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2df20 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2df30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2df40 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2df50 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2df60 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2df70 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2df80 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
2df90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2dfa0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
2dfb0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
2dfc0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2dfd0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2dfe0 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2dff0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e000 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2e010 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2e020 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2e030 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2e040 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2e050 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2e060 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2e070 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2e080 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2e090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e0a0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2e0b0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2e0c0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2e0d0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2e0e0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2e0f0 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2e100 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2e110 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2e120 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2e130 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2e140 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2e150 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2e160 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2e170 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2e180 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2e190 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e1a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2e1b0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2e1c0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2e1d0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2e1e0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2e1f0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2e200 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2e210 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2e220 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2e230 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2e240 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2e250 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2e260 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2e270 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2e280 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2e290 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2e2a0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2e2b0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2e2c0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2e2d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2e2e0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2e2f0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2e300 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2e310 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2e320 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2e330 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2e340 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2e350 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2e360 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2e370 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2e380 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2e390 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2e3a0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2e3b0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2e3c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2e3d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2e3e0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2e3f0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2e400 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2e410 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2e420 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2e430 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2e440 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2e450 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2e460 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2e470 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2e480 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2e490 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2e4a0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2e4b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2e4c0 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2e4d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2e4e0 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2e4f0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2e500 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2e510 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
2e520 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2e530 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2e540 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2e550 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
2e560 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2e570 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2e580 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
2e590 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
2e5a0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2e5b0 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2e5c0 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2e5d0 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
2e5e0 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
2e5f0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2e600 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2e610 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2e620 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2e630 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2e640 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2e650 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2e660 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2e670 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2e680 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2e690 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2e6a0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2e6b0 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2e6c0 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2e6d0 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2e6e0 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2e6f0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2e700 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2e710 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2e720 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2e730 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2e740 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2e750 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2e760 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2e770 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2e780 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2e790 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2e7a0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2e7b0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2e7c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2e7d0 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2e7e0 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2e7f0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2e800 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2e810 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2e820 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2e830 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2e840 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
2e850 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2e860 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2e870 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
2e880 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2e890 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2e8a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2e8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e8c0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2e8d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2e8e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2e8f0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2e900 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2e910 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2e920 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2e930 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2e940 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2e950 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2e960 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2e970 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2e980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e9a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e9b0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2e9c0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2e9d0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2e9e0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2e9f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ea00 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2ea10 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2ea20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ea30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ea40 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2ea50 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ea60 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2ea70 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2ea80 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2ea90 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2eaa0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2eab0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2eac0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2ead0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2eae0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2eaf0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2eb00 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2eb10 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2eb20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2eb30 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2eb40 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2eb50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2eb60 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2eb70 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2eb80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2eb90 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2eba0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2ebb0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2ebc0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2ebd0 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2ebe0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2ebf0 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2ec00 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2ec10 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2ec20 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2ec30 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2ec40 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2ec50 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2ec60 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2ec70 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2ec80 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2ec90 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2eca0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2ecb0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2ecc0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2ecd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2ece0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2ecf0 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2ed00 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2ed10 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2ed20 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2ed30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2ed40 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2ed50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2ed60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2ed70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2ed80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2ed90 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2eda0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2edb0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2edc0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2edd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2ede0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2edf0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2ee00 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2ee10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ee20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2ee30 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2ee40 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2ee50 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2ee60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ee70 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2ee80 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2ee90 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
2eea0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2eeb0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2eec0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2eed0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2eee0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2eef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ef00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ef10 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2ef20 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2ef30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ef40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2ef50 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2ef60 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2ef70 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2ef80 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2ef90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2efa0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2efb0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2efc0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2efd0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2efe0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2eff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2f000 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2f010 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2f020 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2f030 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2f040 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2f050 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2f060 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2f070 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2f080 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2f090 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2f0a0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2f0b0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2f0c0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2f0d0 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2f0e0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2f0f0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2f100 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f110 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  e];.  if( (++pCu
2f120 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2f130 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e  Page])>=pPage->n
2f140 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2f150 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2f160 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75  age]--;.    retu
2f170 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2f180 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2f190 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2f1a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f1b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2f1c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2f1d0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2f1e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2f1f0 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2f200 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2f210 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2f220 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2f230 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2f240 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2f250 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2f260 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2f270 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2f280 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2f290 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f2a0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2f2b0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2f2c0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2f2d0 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2f2e0 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2f2f0 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2f300 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61  Previous().  Tha
2f310 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2f320 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2f330 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2f340 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e   merely decremen
2f350 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2f360 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2f370 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70  iIdx.** to the p
2f380 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20  revious cell on 
2f390 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2f3a0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2f3b0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a  btreePrevious().
2f3c0 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  ** helper routin
2f3d0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2f3e0 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2f3f0 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2f400 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  fferent page.** 
2f410 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  or to restore th
2f420 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2f430 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2f440 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2f450 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2f460 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2f470 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2f480 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2f490 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2f4a0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2f4b0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2f4c0 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2f4d0 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2f4e0 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2f4f0 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2f500 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2f510 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2f520 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2f530 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2f540 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2f550 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2f560 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2f570 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2f580 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2f590 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2f5a0 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2f5b0 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2f5c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2f5d0 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2f5e0 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2f5f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2f600 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2f610 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2f620 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2f630 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2f640 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2f650 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2f660 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2f670 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2f680 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2f690 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2f6a0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2f6b0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2f6c0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2f6d0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2f6e0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2f6f0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2f700 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2f710 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2f720 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2f730 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2f750 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2f760 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2f770 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2f780 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2f790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2f7a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2f7b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2f7c0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f7d0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2f7e0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2f7f0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2f800 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2f820 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2f830 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2f840 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2f850 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2f860 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2f870 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2f890 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2f8a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2f8b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2f8c0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2f8d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f8e0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2f8f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f900 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2f910 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2f920 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2f930 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2f940 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2f950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f960 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2f970 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2f980 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2f990 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2f9a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2f9b0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2f9c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2f9d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2f9e0 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2f9f0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2fa00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2fa10 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2fa20 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2fa30 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2fa40 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2fa50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2fa60 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2fa70 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2fa80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2fa90 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2faa0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2fab0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2fac0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2fad0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2fae0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2faf0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2fb00 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2fb10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fb20 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2fb30 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2fb40 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2fb50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2fb60 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2fb70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2fb80 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2fb90 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2fba0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
2fbb0 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
2fbc0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2fbd0 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
2fbe0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2fbf0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2fc00 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2fc10 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2fc20 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2fc30 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2fc40 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2fc50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2fc60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fc70 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2fc80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2fc90 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2fca0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2fcb0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2fcc0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2fcd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2fce0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2fcf0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2fd00 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2fd10 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2fd20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2fd30 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2fd40 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2fd50 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
2fd60 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  s = 0;.  pCur->c
2fd70 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2fd80 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2fd90 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2fda0 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  idNKey);.  pCur-
2fdb0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2fdc0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2fdd0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2fde0 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69  D.   || pCur->ai
2fdf0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2fe00 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  ==0.   || pCur->
2fe10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2fe20 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  ge]->leaf==0.  )
2fe30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2fe40 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2fe50 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   pRes);.  }.  pC
2fe60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2fe70 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75  iPage]--;.  retu
2fe80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2fe90 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2fea0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2feb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fec0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2fed0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2fee0 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2fef0 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2ff00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2ff10 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
2ff20 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
2ff30 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
2ff40 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
2ff50 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
2ff60 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
2ff70 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
2ff80 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2ff90 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
2ffa0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
2ffb0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2ffc0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
2ffd0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2ffe0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2fff0 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
30000 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
30010 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
30020 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
30030 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
30040 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
30050 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
30060 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
30070 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
30080 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
30090 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
300a0 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
300b0 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
300c0 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
300d0 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
300e0 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
300f0 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
30100 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
30110 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
30120 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30130 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
30140 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
30150 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
30160 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
30170 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
30180 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
30190 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
301a0 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
301b0 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
301c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
301d0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
301e0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
301f0 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
30200 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
30210 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
30220 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
30230 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
30240 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
30250 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
30260 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
30270 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
30280 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
30290 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
302a0 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
302b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
302c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
302d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
302e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
302f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30300 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
30310 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
30320 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
30330 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
30340 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
30350 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
30360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
30370 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
30380 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
30390 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
303a0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
303b0 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
303c0 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
303d0 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
303e0 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
303f0 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
30400 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
30410 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
30420 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
30430 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
30440 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30450 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
30460 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
30470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30480 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
30490 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
304a0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
304b0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
304c0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
304d0 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
304e0 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
304f0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
30500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
30510 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
30520 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30530 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
30540 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
30550 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
30560 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
30570 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
30580 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
30590 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
305a0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
305b0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
305c0 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
305d0 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
305e0 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
305f0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
30600 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
30610 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
30620 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
30630 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
30640 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
30650 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
30660 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30670 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
30680 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
30690 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
306a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
306b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
306c0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73  T;.  }..  /* Ens
306d0 75 72 65 20 70 61 67 65 20 31 20 69 73 20 77 72  ure page 1 is wr
306e0 69 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e  itable. This fun
306f0 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68 65  ction will eithe
30700 72 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d  r change the num
30710 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65  ber.  ** of page
30720 73 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s in the free-li
30730 73 74 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  st or the size o
30740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30750 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f 74 68 0a  ile. Since both.
30760 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f 70    ** of these op
30770 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76 65  erations involve
30780 20 6d 6f 64 69 66 79 69 6e 67 20 70 61 67 65 20   modifying page 
30790 31 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2c  1 header fields,
307a0 20 70 61 67 65 20 31 0a 20 20 2a 2a 20 77 69 6c   page 1.  ** wil
307b0 6c 20 64 65 66 69 6e 69 74 65 6c 79 20 62 65 20  l definitely be 
307c0 77 72 69 74 74 65 6e 20 62 79 20 74 68 69 73 20  written by this 
307d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
307e0 74 68 69 73 20 69 73 20 61 6e 20 55 4e 4c 4f 43  this is an UNLOC
307f0 4b 45 44 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  KED.  ** transac
30800 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20 74 68 65  tion, ensure the
30810 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
30820 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 20  ucture has been 
30830 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
30840 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 21 3d   assert( eMode!=
30850 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 7c 7c  BTALLOC_EXACT ||
30860 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 55   sqlite3PagerIsU
30870 6e 6c 6f 63 6b 65 64 28 70 42 74 2d 3e 70 50 61  nlocked(pBt->pPa
30880 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20  ger)==0 );.  rc 
30890 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
308a0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
308b0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
308c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
308d0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
308e0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
308f0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
30900 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
30910 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
30920 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
30930 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
30940 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
30950 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
30960 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
30970 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
30980 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
30990 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
309a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
309b0 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
309c0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
309d0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
309e0 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
309f0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
30a00 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
30a10 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
30a20 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
30a30 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
30a40 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
30a50 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
30a60 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
30a70 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
30a80 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
30a90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30aa0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
30ab0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
30ac0 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
30ad0 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
30ae0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
30af0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
30b00 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
30b10 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
30b20 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
30b30 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
30b40 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
30b50 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
30b60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
30b70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30b80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
30b90 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
30ba0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
30bb0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
30bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30bd0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
30be0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
30bf0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
30c00 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
30c10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
30c20 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
30c30 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
30c40 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
30c50 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
30c60 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
30c70 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
30c80 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
30c90 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
30ca0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  1..    */.    pu
30cb0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
30cc0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
30cd0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
30ce0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
30cf0 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
30d00 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
30d10 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
30d20 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
30d30 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
30d40 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
30d50 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
30d60 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
30d70 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
30d80 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
30d90 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
30da0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
30db0 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
30dc0 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
30dd0 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
30de0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
30df0 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
30e00 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
30e10 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
30e20 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
30e30 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
30e40 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
30e50 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
30e60 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
30e70 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
30e80 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
30e90 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
30ea0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
30eb0 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
30ec0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
30ed0 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
30ee0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
30ef0 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
30f00 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
30f10 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
30f20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
30f30 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
30f40 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
30f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30f60 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
30f70 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
30f80 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
30f90 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
30fa0 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
30fb0 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
30fc0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
30fd0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
30fe0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
30ff0 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
31000 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
31010 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
31020 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
31030 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
31040 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
31050 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
31060 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
31070 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
31080 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
31090 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
310a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
310b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
310c0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
310d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
310e0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
310f0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
31100 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
31110 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
31120 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
31130 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
31140 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31150 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
31160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
31170 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
31180 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
31190 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
311a0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
311b0 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
311c0 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
311d0 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
311e0 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
311f0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
31200 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
31210 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
31220 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
31230 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
31240 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
31250 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
31260 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
31270 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
31280 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
31290 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
312a0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
312b0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
312c0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
312d0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
312e0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
312f0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
31300 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
31310 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
31320 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
31330 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
31340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31350 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
31360 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31370 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31380 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31390 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
313a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
313b0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
313c0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
313d0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
313e0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
313f0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
31400 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
31410 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
31420 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
31430 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
31440 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
31450 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
31460 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
31470 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
31480 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
31490 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
314a0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
314b0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
314c0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
314d0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
314e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
314f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
31500 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
31510 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31520 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
31530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31540 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
31550 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
31560 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
31570 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
31580 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
31590 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
315a0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
315b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
315c0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
315d0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
315e0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
315f0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
31600 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
31610 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
31620 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
31630 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
31640 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
31650 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
31660 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
31670 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
31680 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
31690 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
316a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
316b0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
316c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
316d0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
316e0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
316f0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
31700 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
31710 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31720 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
31730 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
31740 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
31750 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
31760 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
31770 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31780 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31790 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
317a0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
317b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
317c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
317d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
317e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
317f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31800 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31810 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
31820 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
31830 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
31840 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
31850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31870 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
31880 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
31890 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
318a0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
318b0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
318c0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
318d0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
318e0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
318f0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
31900 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
31910 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
31920 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
31930 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
31940 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
31950 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
31960 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
31970 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
31980 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
31990 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
319a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
319b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
319c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
319d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
319e0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
319f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
31a00 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
31a10 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
31a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
31a30 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
31a40 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
31a50 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
31a60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31a80 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31a90 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31aa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
31ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31ac0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31ad0 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
31ae0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
31af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31b10 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
31b20 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
31b30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
31b40 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
31b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31b60 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
31b70 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
31b80 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
31b90 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
31ba0 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
31bb0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
31bc0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
31bd0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
31be0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
31bf0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
31c00 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
31c10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31c20 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
31c30 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
31c40 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
31c50 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
31c60 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31c70 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
31c80 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
31c90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
31ca0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
31cb0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
31cc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31cd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31ce0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31cf0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
31d00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
31d10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31d20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
31d30 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31d40 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
31d50 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
31d60 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
31d70 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
31d80 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31da0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
31db0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
31dc0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
31dd0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
31de0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
31df0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
31e00 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
31e10 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
31e20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
31e30 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
31e40 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
31e50 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
31e60 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
31e70 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
31e80 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
31e90 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
31ea0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
31eb0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
31ec0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
31ed0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
31ee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
31ef0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
31f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
31f10 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
31f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31f30 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
31f40 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
31f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31f60 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
31f70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
31f80 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
31f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31fa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31fe0 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
31ff0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
32000 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
32010 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
32020 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
32030 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
32040 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
32050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
32060 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
32070 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
32080 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
32090 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
320a0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
320b0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
320c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
320d0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
320e0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
320f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
32100 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32130 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
32140 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
32150 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
32160 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
32170 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
32180 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
32190 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
321a0 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
321b0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
321c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
321d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
321e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
321f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32210 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
32220 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32230 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
32240 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
32250 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
32260 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
32270 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
32280 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
32290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
322a0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
322b0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
322c0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
322d0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
322e0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
322f0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
32300 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
32310 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
32320 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
32330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32340 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
32350 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
32360 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
32370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32380 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32390 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
323a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
323b0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
323c0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
323d0 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
323e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
323f0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
32400 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
32410 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
32420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32430 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32440 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
32450 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
32460 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
32470 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
32480 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
32490 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
324a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
324b0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
324c0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
324d0 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
324e0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
324f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32510 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32520 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
32530 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32540 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32560 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
32570 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
32580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
32590 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
325a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
325b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
325c0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
325d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
325e0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
325f0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
32600 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
32610 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
32620 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
32630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
32640 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
32650 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
32660 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
32670 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
32680 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
32690 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
326a0 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
326b0 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
326c0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
326d0 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
326e0 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
326f0 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
32700 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
32710 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
32720 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
32730 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
32740 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
32750 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
32760 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
32770 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
32780 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
32790 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
327a0 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
327b0 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
327c0 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
327d0 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
327e0 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
327f0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
32800 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
32810 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
32820 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
32830 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
32840 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
32850 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
32860 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
32870 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
32880 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
32890 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
328a0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
328b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
328c0 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
328d0 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
328e0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
328f0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
32900 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
32910 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
32920 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
32930 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
32940 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
32950 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
32960 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
32970 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
32980 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
32990 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
329a0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
329b0 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
329c0 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
329d0 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
329e0 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
329f0 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
32a00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
32a10 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
32a20 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
32a30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
32a40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
32a50 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
32a60 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
32a70 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
32a80 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
32a90 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
32aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32ab0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
32ac0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
32ad0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
32ae0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
32af0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
32b00 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
32b10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32b20 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
32b30 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
32b40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32b50 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
32b60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
32b70 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
32b80 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
32b90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
32ba0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
32bb0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
32bc0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
32bd0 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
32be0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
32bf0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
32c00 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
32c10 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
32c20 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
32c30 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
32c40 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
32c50 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
32c60 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
32c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
32c80 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
32c90 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
32ca0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
32cb0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
32cc0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
32cd0 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
32ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32cf0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
32d00 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
32d10 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
32d20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
32d30 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
32d40 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
32d50 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
32d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32d70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
32d80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32d90 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
32da0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32db0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
32dc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
32dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32de0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
32df0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
32e00 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
32e10 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
32e20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
32e30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32e40 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
32e50 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
32e60 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
32e70 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
32e80 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
32e90 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
32ea0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
32eb0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
32ec0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
32ed0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
32ee0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
32ef0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
32f00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32f10 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
32f20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
32f30 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
32f40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
32f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32f60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
32f70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
32f80 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
32f90 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
32fa0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
32fb0 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
32fc0 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
32fd0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
32fe0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
32ff0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
33000 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
33010 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
33020 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
33030 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
33040 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
33050 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
33060 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33070 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
33080 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
33090 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
330a0 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
330b0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
330c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
330d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
330e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
330f0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
33100 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33110 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
33120 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
33130 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
33140 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
33150 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
33160 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
33170 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
33180 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
33190 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
331a0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
331b0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
331c0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
331d0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
331e0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
331f0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
33200 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
33210 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
33220 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
33230 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
33240 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
33250 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
33260 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
33270 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
33280 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
33290 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
332a0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
332b0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
332c0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
332d0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
332e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
332f0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
33300 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
33310 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
33320 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
33330 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
33340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33350 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
33360 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
33370 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33390 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
333a0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
333b0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
333c0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
333d0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
333e0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
333f0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
33400 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
33410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33420 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
33430 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
33440 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
33450 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
33460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33470 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
33480 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
33490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
334b0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
334c0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
334d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
334e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
334f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
33500 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
33510 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
33520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
33530 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
33540 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
33550 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
33560 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
33570 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33580 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
33590 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
335a0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
335b0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
335c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
335d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
335e0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
335f0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
33600 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
33610 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
33620 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
33630 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
33640 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33650 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
33660 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
33670 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33680 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
33690 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
336a0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
336b0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
336c0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
336d0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
336e0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
336f0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
33700 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
33710 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
33720 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
33730 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
33740 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
33750 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
33760 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
33770 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
33780 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
33790 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
337a0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
337b0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
337c0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
337d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
337e0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
337f0 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
33800 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
33810 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
33820 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
33830 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
33840 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
33850 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
33860 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
33870 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
33880 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
33890 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
338a0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
338b0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
338c0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
338d0 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52 45 5f  /.  if( REQUIRE_
338e0 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20 70 74  PTRMAP ){.    pt
338f0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
33900 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
33910 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
33920 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
33930 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33940 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
33950 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
33960 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
33970 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
33980 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
33990 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
339a0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
339b0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
339c0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
339d0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
339e0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
339f0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
33a00 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
33a10 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
33a20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
33a30 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
33a40 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
33a50 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
33a60 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
33a70 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
33a80 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
33a90 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
33aa0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
33ab0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
33ac0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
33ad0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
33ae0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
33af0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
33b00 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
33b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33b20 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
33b30 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
33b40 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
33b50 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
33b60 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
33b70 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
33b80 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
33b90 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
33ba0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
33bb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33bc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
33bd0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
33be0 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
33bf0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
33c00 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
33c10 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
33c20 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
33c30 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
33c40 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
33c50 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
33c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
33c70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
33c80 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
33c90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
33ca0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
33cb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
33cc0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
33cd0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33ce0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
33cf0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
33d00 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
33d10 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
33d20 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
33d30 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
33d40 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
33d50 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
33d60 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
33d70 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
33d80 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
33d90 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
33da0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
33db0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
33dc0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
33dd0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
33de0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
33df0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
33e00 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
33e10 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
33e20 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
33e30 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
33e40 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
33e50 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
33e60 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
33e70 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
33e80 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
33e90 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
33ea0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
33eb0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
33ec0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
33ed0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
33ee0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
33ef0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
33f00 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
33f10 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
33f20 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
33f30 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
33f40 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
33f50 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
33f60 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
33f70 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
33f80 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
33f90 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
33fa0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
33fb0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
33fc0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
33fd0 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
33fe0 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
33ff0 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
34000 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
34010 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
34020 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
34030 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
34040 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
34050 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
34060 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
34070 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
34080 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
34090 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
340a0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
340b0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
340c0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
340d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
340e0 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
340f0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34100 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
34110 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
34120 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
34130 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
34140 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34150 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
34160 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
34170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34190 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
341a0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
341b0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
341c0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
341d0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
341e0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
341f0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
34200 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
34210 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
34220 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
34230 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34240 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
34250 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
34260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
34270 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
34280 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
34290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
342a0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
342b0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
342c0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
342d0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
342e0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
342f0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34300 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
34310 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
34320 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
34330 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
34340 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
34350 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
34360 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
34370 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
34380 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
34390 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
343a0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
343b0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
343c0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
343d0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
343e0 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
343f0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
34400 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
34410 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
34420 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
34430 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
34440 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
34450 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
34460 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
34470 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
34480 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
34490 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
344a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
344b0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
344c0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
344d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
344e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
344f0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
34500 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
34510 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34520 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
34530 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
34540 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
34550 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
34560 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
34570 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
34580 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34590 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
345a0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
345b0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
345c0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
345d0 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
345e0 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
345f0 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
34600 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
34610 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
34620 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
34630 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
34640 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
34650 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
34660 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
34670 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
34680 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
34690 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
346a0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
346b0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
346c0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
346d0 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
346e0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
346f0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
34700 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
34710 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
34720 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
34730 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
34740 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
34750 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
34760 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
34770 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
34780 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
34790 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
347a0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
347b0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
347c0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
347d0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
347e0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
347f0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
34800 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
34810 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
34820 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
34830 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
34840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
34850 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
34860 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
34870 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
34880 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
34890 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
348a0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
348b0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
348c0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
348d0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
348e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
348f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
34900 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
34910 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
34920 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
34930 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
34940 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
34950 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
34960 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
34970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34980 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
34990 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
349a0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
349b0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
349c0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
349d0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
349e0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
349f0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
34a00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34a10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
34a20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
34a30 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
34a40 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
34a50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
34a60 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
34a70 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
34a80 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
34a90 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
34aa0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
34ab0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
34ac0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
34ad0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
34ae0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
34af0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
34b00 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
34b10 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
34b20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
34b30 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
34b40 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
34b50 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
34b60 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
34b70 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
34b80 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
34b90 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
34ba0 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
34bb0 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
34bc0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
34bd0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
34be0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
34bf0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
34c00 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
34c10 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
34c20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
34c30 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
34c40 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
34c50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
34c60 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
34c70 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
34c80 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
34c90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34ca0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34cb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
34cc0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
34cd0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
34ce0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
34cf0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
34d00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
34d10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34d20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
34d30 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
34d40 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
34d50 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
34d60 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
34d70 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
34d80 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
34d90 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
34da0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
34db0 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
34dc0 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
34dd0 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
34de0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
34df0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
34e00 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
34e10 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
34e20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
34e30 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
34e40 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
34e50 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
34e60 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
34e70 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
34e80 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
34e90 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
34ea0 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
34eb0 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
34ec0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
34ed0 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
34ee0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
34ef0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
34f00 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
34f10 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
34f20 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
34f30 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
34f40 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
34f50 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
34f60 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
34f70 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
34f80 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
34f90 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
34fa0 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
34fb0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
34fc0 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
34fd0 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
34fe0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
34ff0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
35000 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
35010 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
35020 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
35030 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
35040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
35050 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
35060 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
35070 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
35080 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
35090 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
350a0 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
350b0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
350c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
350d0 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
350e0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
350f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
35110 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
35120 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
35130 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
35140 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
35150 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
35160 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
35170 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
35180 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
35190 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
351a0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
351b0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
351c0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
351d0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
351e0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
351f0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
35200 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
35210 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
35220 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
35230 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
35240 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
35250 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
35260 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
35270 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
35280 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
35290 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
352a0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
352b0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
352c0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
352d0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
352e0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
352f0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
35300 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
35310 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
35320 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
35330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35340 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
35350 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
35360 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
35370 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
35380 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
35390 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
353a0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
353b0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
353c0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
353d0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
353e0 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
353f0 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
35400 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
35410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35420 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
35430 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
35440 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
35450 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
35460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35470 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
35480 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
35490 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
354a0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
354b0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
354c0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
354d0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
354e0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
354f0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
35500 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
35510 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
35520 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
35530 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
35540 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
35550 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
35560 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
35570 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
35580 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
35590 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
355a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
355b0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
355c0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
355d0 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
355e0 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
355f0 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
35600 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
35610 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
35620 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
35630 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
35640 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
35650 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
35660 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
35670 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
35680 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
35690 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
356a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
356b0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
356c0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
356d0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
356e0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
356f0 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
35700 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
35710 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
35720 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
35730 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
35740 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
35750 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
35760 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
35770 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
35780 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35790 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
357a0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
357b0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
357c0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
357d0 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
357e0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
357f0 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
35800 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
35810 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
35820 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
35830 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
35840 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
35850 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c     assert( nKey<
35860 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
35870 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50  Key!=0 );.    nP
35880 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
35890 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
358a0 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
358b0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
358c0 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
358d0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
358e0 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
358f0 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
35900 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
35910 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
35920 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
35930 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
35940 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
35950 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
35960 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
35970 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
35980 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
35990 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
359a0 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
359b0 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
359c0 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
359d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
359e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
359f0 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
35a00 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
35a10 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
35a20 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
35a30 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
35a40 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
35a50 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
35a60 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
35a70 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
35a80 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
35a90 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
35aa0 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
35ab0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
35ac0 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
35ad0 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
35ae0 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
35af0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
35b00 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
35b10 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
35b20 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
35b30 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
35b40 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
35b50 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
35b60 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
35b70 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
35b80 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
35b90 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
35ba0 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
35bb0 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
35bc0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
35bd0 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
35be0 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
35bf0 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
35c00 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
35c10 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
35c20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
35c30 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
35c40 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
35c50 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
35c60 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
35c70 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
35c80 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
35c90 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
35ca0 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
35cb0 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
35cc0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
35cd0 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
35ce0 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
35cf0 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
35d00 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
35d10 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
35d20 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
35d30 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
35d40 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
35d50 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
35d60 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
35d70 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e  ert( nHeader=(in
35d80 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
35d90 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
35da0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
35db0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
35dc0 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
35dd0 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
35de0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
35df0 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
35e00 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  Local );.    ass
35e10 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26  ert( pPrior == &
35e20 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
35e30 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e  flow] );.  }.#en
35e40 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
35e50 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
35e60 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
35e70 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
35e80 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
35e90 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
35ea0 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
35eb0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
35ec0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
35ed0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
35ee0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
35ef0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
35f00 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
35f10 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
35f20 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
35f30 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
35f40 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
35f50 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
35f60 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
35f70 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
35f80 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
35f90 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
35fa0 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
35fb0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
35fc0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
35fd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
35fe0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
35ff0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
36000 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
36010 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
36020 4f 76 66 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 20  Ovfl, 0);..     
36030 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
36040 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
36050 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
36060 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
36070 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
36080 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
36090 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
360a0 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
360b0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
360c0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
360d0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
360e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
360f0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
36100 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
36110 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
36120 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
36130 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
36140 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
36150 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
36160 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
36170 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
36180 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
36190 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
361a0 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
361b0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
361c0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
361d0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
361e0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
361f0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
36200 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
36210 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
36220 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
36230 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 52    */.      if( R
36240 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20 26 26  EQUIRE_PTRMAP &&
36250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36260 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
36270 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
36280 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
36290 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
362a0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
362b0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
362c0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
362d0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
362e0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
362f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
36300 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
36310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36320 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
36330 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
36340 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
36350 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
36360 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
36370 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
36380 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
36390 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
363a0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
363b0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
363c0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
363d0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
363e0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
363f0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
36400 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
36410 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
36420 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36430 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
36440 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
36450 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
36460 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
36470 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
36480 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
36490 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
364a0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
364b0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
364c0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
364d0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
364e0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
364f0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
36500 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
36510 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36520 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
36530 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
36540 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
36550 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
36560 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36570 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
36580 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
36590 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
365a0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
365b0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
365c0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
365d0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
365e0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
365f0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
36600 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
36610 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
36620 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
36630 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
36640 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
36650 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
36660 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
36670 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
36680 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
36690 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
366a0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
366b0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
366c0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
366d0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
366e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
366f0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
36700 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36710 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
36720 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
36730 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
36740 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
36750 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
36760 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
36770 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
36780 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
36790 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
367a0 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
367b0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
367c0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
367d0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
367e0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
367f0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
36800 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
36810 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
36820 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
36830 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
36840 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
36850 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
36860 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
36870 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
36880 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
36890 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
368a0 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
368b0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
368c0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
368d0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
368e0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
368f0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
36900 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
36910 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
36920 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
36930 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
36940 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
36950 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
36960 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
36970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36980 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
36990 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
369a0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
369b0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
369c0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
369d0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
369e0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
369f0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
36a00 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
36a10 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
36a20 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
36a30 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
36a40 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
36a50 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
36a60 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
36a70 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
36a80 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
36a90 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
36aa0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
36ab0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
36ac0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
36ad0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
36ae0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
36af0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
36b00 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
36b10 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
36b20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
36b30 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
36b40 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
36b50 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
36b60 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
36b70 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
36b80 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
36b90 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
36ba0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
36bb0 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
36bc0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
36bd0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
36be0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
36bf0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
36c00 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
36c10 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
36c20 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
36c30 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
36c40 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
36c50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
36c60 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
36c70 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
36c80 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
36c90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36ca0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36cb0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
36cc0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
36cd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
36ce0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
36cf0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
36d00 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
36d10 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
36d20 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
36d30 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
36d40 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
36d50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
36d60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
36d70 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
36d80 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
36d90 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
36da0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
36db0 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
36dc0 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
36dd0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
36de0 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
36df0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
36e00 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
36e10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
36e20 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
36e30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
36e40 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
36e50 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
36e60 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
36e70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
36e80 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
36e90 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
36ea0 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
36eb0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
36ec0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
36ed0 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
36ee0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
36ef0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
36f00 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36f10 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
36f20 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
36f30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
36f40 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
36f50 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
36f60 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
36f70 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
36f80 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
36f90 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
36fa0 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
36fb0 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
36fc0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
36fd0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
36fe0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
36ff0 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
37000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
37010 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
37020 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
37030 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
37040 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
37050 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
37060 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
37070 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37080 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
37090 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
370a0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
370b0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
370c0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
370d0 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
370e0 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
370f0 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
37100 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
37110 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
37120 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
37130 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
37140 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
37150 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
37160 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
37170 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
37180 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
37190 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
371a0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
371b0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
371c0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
371d0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
371e0 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
371f0 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
37200 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
37210 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ented..*/.static
37220 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
37230 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
37240 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
37250 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
37260 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
37270 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
37280 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
37290 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
372a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
372b0 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
372c0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
372d0 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
372e0 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
372f0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
37300 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
37310 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
37320 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
37330 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
37340 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
37350 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
37360 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
37370 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
37380 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
37390 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
373a0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
373b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
373c0 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
373d0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
373e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
373f0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
37400 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
37410 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
37420 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
37430 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
37440 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
37450 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
37460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
37470 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
37480 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
37490 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIns;         /*
374a0 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50   The point in pP
374b0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20  age->aCellIdx[] 
374c0 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e  where no cell in
374d0 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28  serted */..  if(
374e0 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
374f0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
37500 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
37510 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
37520 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
37530 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
37540 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
37550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
37560 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
37570 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
37580 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
37590 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
375a0 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
375b0 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
375c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
375d0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
375e0 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
375f0 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
37600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
37610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37620 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
37630 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
37640 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
37650 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
37660 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
37670 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
37680 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
37690 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
376a0 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
376b0 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
376c0 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
376d0 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
376e0 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
376f0 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
37700 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
37710 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
37720 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
37730 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
37740 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
37750 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
37760 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
37770 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
37780 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
37790 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
377a0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61   assert( sz==pPa
377b0 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
377c0 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
377d0 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
377e0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
377f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
37800 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
37810 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
37820 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
37830 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c  py(pTemp, pCell,
37840 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c   sz);.      pCel
37850 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
37860 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
37870 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
37880 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
37890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
378a0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
378b0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
378c0 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
378d0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69  Page->apOvfl)/si
378e0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
378f0 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
37900 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20  Page->apOvfl[j] 
37910 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
37920 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->aiOvfl[j] = 
37930 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20  (u16)i;..    /* 
37940 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  When multiple ov
37950 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74  erflows occur, t
37960 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73  hey are always s
37970 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e  equential and in
37980 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f  .    ** sorted o
37990 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61  rder.  This inva
379a0 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63  riants arise bec
379b0 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76  ause multiple ov
379c0 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20  erflows can.    
379d0 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68  ** only occur wh
379e0 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76  en inserting div
379f0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
37a00 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
37a10 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61  during.    ** ba
37a20 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65  lancing, and the
37a30 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64   dividers are ad
37a40 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65  jacent and sorte
37a50 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  d..    */.    as
37a60 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50  sert( j==0 || pP
37a70 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d  age->aiOvfl[j-1]
37a80 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76  <(u16)i ); /* Ov
37a90 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65  erflows in sorte
37aa0 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61  d order */.    a
37ab0 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69  ssert( j==0 || i
37ac0 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b  ==pPage->aiOvfl[
37ad0 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f  j-1]+1 );   /* O
37ae0 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71  verflows are seq
37af0 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c  uential */.  }el
37b00 73 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64  se{.    BtShared
37b10 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
37b20 42 74 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  Bt;.    int rc =
37b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37b40 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
37b50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
37b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37b70 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
37b80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
37b90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
37ba0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37bb0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
37bc0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
37bd0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
37be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64  ;.    assert( &d
37bf0 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
37c00 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61  ffset]==pPage->a
37c10 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72  CellIdx );.    r
37c20 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  c = allocateSpac
37c30 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64  e(pPage, sz, &id
37c40 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  x);.    if( rc )
37c50 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74  { *pRC = rc; ret
37c60 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68  urn; }.    /* Th
37c70 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  e allocateSpace(
37c80 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e  ) routine guaran
37c90 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tees the followi
37ca0 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  ng properties.  
37cb0 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
37cc0 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ns successfully 
37cd0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
37ce0 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61  dx >= 0 );.    a
37cf0 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50  ssert( idx >= pP
37d00 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
37d10 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32  2*pPage->nCell+2
37d20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
37d30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
37d40 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 42 74  x+sz <= (int)pBt
37d50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
37d60 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
37d70 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
37d80 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
37d90 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
37da0 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
37db0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
37dc0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
37dd0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
37de0 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61  }.    pIns = pPa
37df0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69  ge->aCellIdx + i
37e00 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  *2;.    memmove(
37e10 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a  pIns+2, pIns, 2*
37e20 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
37e30 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i));.    put2byt
37e40 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20  e(pIns, idx);.  
37e50 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
37e60 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65  ;.    /* increme
37e70 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  nt the cell coun
37e80 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b  t */.    if( (++
37e90 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
37ea0 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64  ffset+4])==0 ) d
37eb0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
37ec0 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61  fset+3]++;.    a
37ed0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
37ee0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
37ef0 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67  Offset+3])==pPag
37f00 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
37f10 69 66 28 20 52 45 51 55 49 52 45 5f 50 54 52 4d  if( REQUIRE_PTRM
37f20 41 50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  AP ){.      /* T
37f30 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
37f40 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
37f50 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
37f60 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
37f70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
37f80 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
37f90 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
37fa0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
37fb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
37fc0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
37fd0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
37fe0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
37ff0 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61  /*.** A CellArra
38000 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  y object contain
38010 73 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69  s a cache of poi
38020 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20  nters and sizes 
38030 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75  for a.** consecu
38040 74 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66  tive sequence of
38050 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68   cells that migh
38060 74 20 62 65 20 68 65 6c 64 20 6d 75 6c 74 69 70  t be held multip
38070 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70  le pages..*/.typ
38080 65 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c  edef struct Cell
38090 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b  Array CellArray;
380a0 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61  .struct CellArra
380b0 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  y {.  int nCell;
380c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
380d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
380e0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
380f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b    MemPage *pRef;
38100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
38110 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20  erence page */. 
38120 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20   u8 **apCell;   
38130 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
38140 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61  cells begin bala
38150 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
38160 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
38170 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
38180 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
38190 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a  apCell[] */.};..
381a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
381b0 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61  the cell sizes a
381c0 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e  t idx, idx+1, ..
381d0 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20  ., idx+N-1 have 
381e0 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64  been.** computed
381f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38200 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63   populateCellCac
38210 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c  he(CellArray *p,
38220 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29   int idx, int N)
38230 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  {.  assert( idx>
38240 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e  =0 && idx+N<=p->
38250 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65  nCell );.  while
38260 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ( N>0 ){.    ass
38270 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  ert( p->apCell[i
38280 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  dx]!=0 );.    if
38290 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d  ( p->szCell[idx]
382a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
382b0 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d  szCell[idx] = p-
382c0 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
382d0 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
382e0 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d  ell[idx]);.    }
382f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
38300 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
38310 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
38320 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d  p->szCell[idx]==
38330 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
38340 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
38350 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20  pCell[idx]) );. 
38360 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a     }.    idx++;.
38370 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a      N--;.  }.}..
38380 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
38390 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68   size of the Nth
383a0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
383b0 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74  cell array.*/.st
383c0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
383d0 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65  LINE u16 compute
383e0 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72  CellSize(CellArr
383f0 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  ay *p, int N){. 
38400 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26   assert( N>=0 &&
38410 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20   N<p->nCell );. 
38420 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65   assert( p->szCe
38430 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d  ll[N]==0 );.  p-
38440 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e  >