/ Hex Artifact Content
Login

Artifact 060f2482ef871363617b13c68a1d1c09faf356cc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   = -1;.}.../*.**
4ef0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
4f00: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
4f10: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4f20: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4f30: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4f40: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4f50: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4f60: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4f70: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4f80: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4f90: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4fa0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4fb0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
4fc0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
4fd0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
4fe0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5000: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5020: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5030: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5040: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5050: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5060: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5080: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5090: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
50a0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
50b0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
50c0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
50d0: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
50e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
50f0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5100: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5110: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5120: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5130: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5140: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5150: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
5160: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
5170: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
5180: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
5190: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
51a0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
51b0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
51c0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
51d0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
51e0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
51f0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5200: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5210: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5220: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5230: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5240: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5250: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
5260: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
5270: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
5280: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
5290: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
52a0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
52b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
52c0: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
52d0: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
52e0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
52f0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
5300: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
5310: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5320: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
5330: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5340: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5350: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5360: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5370: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5380: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
53a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
53b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
53c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
53d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
53e0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
53f0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
5400: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
5410: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5420: 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52  OK ){.    btreeR
5430: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5440: 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20  ages(pCur);.    
5450: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5460: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5470: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5480: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5490: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
54a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
54b0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
54c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
54d0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
54e0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
54f0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5500: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5510: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5520: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5530: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5540: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5550: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5560: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5570: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5580: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5590: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
55a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
55b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
55c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
55d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
55e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
55f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5600: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5610: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5620: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5630: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5640: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5650: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5660: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5670: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5680: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5690: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
56a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
56b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
56c0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
56d0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
56e0: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
56f0: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5700: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5710: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5720: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5730: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5740: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5750: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5760: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5770: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5780: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5790: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
57a0: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
57b0: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
57c0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
57d0: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
57e0: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
57f0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5800: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5810: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5820: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5830: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5840: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5850: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5860: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5870: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5880: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5890: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
58a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
58b0: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
58c0: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
58d0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
58e0: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
58f0: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5900: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5910: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5920: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5930: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5940: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5950: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5960: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5970: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5980: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5990: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
59a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
59b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
59c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
59d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
59e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
59f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5a00: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5a10: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5a20: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5a30: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a40: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a50: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a60: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
5a70: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
5a80: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
5a90: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
5aa0: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
5ab0: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
5ac0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
5ad0: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
5ae0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5af0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5b00: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5b10: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5b20: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5b30: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5b40: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5b50: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5b60: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5b70: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5b80: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5b90: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
5ba0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
5bb0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
5bc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
5bd0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
5be0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
5bf0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5c00: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5c10: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5c20: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5c30: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5c40: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5c50: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5c60: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5c70: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5c80: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5c90: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
5ca0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
5cb0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
5cc0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
5cd0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
5ce0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
5cf0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5d00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5d10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5d20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5d30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5d40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5d50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5d60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5d70: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
5d80: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
5d90: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
5da0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
5db0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
5dc0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
5dd0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
5de0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5df0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
5e10: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
5e20: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
5e30: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
5e40: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
5e50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
5e60: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
5e70: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
5e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
5eb0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
5ec0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
5ed0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
5ee0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
5ef0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5f00: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5f20: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5f30: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5f40: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5f50: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
5f70: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
5f80: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
5f90: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
5fa0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
5fb0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
5fc0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
5fd0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
5fe0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
5ff0: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6000: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
6010: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
6020: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
6030: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
6040: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
6050: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
6060: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6070: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6080: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6090: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
60a0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
60b0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
60c0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
60d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
60e0: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
60f0: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6100: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
6110: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
6130: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
6140: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
6150: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
6160: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6170: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6180: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
61b0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
61c0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
61d0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
61e0: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
61f0: 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20  aSpace[200];    
6200: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
6210: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
6220: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
6230: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  loc */.  char *p
6240: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Free = 0;..  if(
6250: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
6260: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6270: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6280: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6290: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
62a0: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
62b0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
62c0: 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f  o, aSpace, sizeo
62d0: 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65  f(aSpace), &pFre
62e0: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
62f0: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6310: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
6320: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
6330: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
6340: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
6350: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
6360: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
6370: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
6380: 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72  lite3DbFree(pCur
6390: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
63a0: 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  pFree);.      re
63b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
63c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
63d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
63e0: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
63f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6400: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
6410: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
6420: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
6430: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
6440: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6450: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
6460: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
6470: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6480: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
6490: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
64a0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
64b0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
64c0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
64d0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
64e0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
64f0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
6500: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
6510: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
6520: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
6530: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
6540: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6550: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
6560: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
6570: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
6580: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6590: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
65a0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
65b0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
65c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
65d0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
65e0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
65f0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6600: 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78  c;.  int skipNex
6610: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  t;.  assert( cur
6620: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
6630: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
6640: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
6650: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6660: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
6670: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6680: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
6690: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
66a0: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
66b0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
66c0: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
66d0: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
66e0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
66f0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
6700: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6710: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6720: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6730: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6740: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6750: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6760: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6770: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6780: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6790: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
67a0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
67b0: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
67c0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
67d0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
67e0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
67f0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
6800: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6810: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6830: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6840: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6850: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6860: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6870: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6880: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6890: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
68a0: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
68b0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
68c0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
68d0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
68e0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
68f0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
6900: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
6910: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6920: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6930: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6940: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6950: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6960: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6970: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6980: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6990: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
69a0: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
69b0: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
69c0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
69d0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
69e0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
69f0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
6a00: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
6a10: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6a20: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6a30: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6a40: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6a50: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6a60: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6a70: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6a80: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6a90: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6aa0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6ab0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
6ac0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6ad0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
6ae0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
6af0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
6b00: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
6b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6b20: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6b30: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6b40: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6b50: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6b60: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6b70: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6b80: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6b90: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6ba0: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6bb0: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
6bc0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6bd0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
6be0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
6bf0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
6c00: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
6c10: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6c20: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6c30: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6c40: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6c50: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6c60: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6c70: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6c80: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6c90: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6ca0: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6cb0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
6cc0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
6cd0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
6ce0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
6cf0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
6d00: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
6d10: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6d20: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6d30: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6d40: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6d50: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6d60: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6d70: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6d80: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6d90: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6da0: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6db0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6dc0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6dd0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
6de0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6df0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6e00: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
6e10: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6e20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6e30: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6e40: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6e50: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
6e60: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65  entRow = 1;.  }e
6e70: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
6e80: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
6e90: 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66  =0 );.    *pDiff
6ea0: 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20  erentRow = 0;.  
6eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6ec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
6ed0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
6ee0: 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a  RSOR_HINTS./*.**
6ef0: 20 47 69 76 65 20 61 20 68 69 6e 74 20 74 6f 20   Give a hint to 
6f00: 74 68 65 20 63 75 72 73 6f 72 20 74 68 61 74 20  the cursor that 
6f10: 69 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 64  it only has to d
6f20: 65 6c 69 76 65 72 20 72 6f 77 73 20 66 6f 72 20  eliver rows for 
6f30: 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 65 78 70  which.** the exp
6f40: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
6f50: 20 74 72 75 65 2e 20 20 57 69 74 68 69 6e 20 74   true.  Within t
6f60: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  his expression, 
6f70: 72 6f 77 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  rows of the.** c
6f80: 75 72 73 6f 72 20 61 72 65 20 69 64 65 6e 74 69  ursor are identi
6f90: 66 69 65 64 20 62 79 20 45 78 70 72 2e 6f 70 3d  fied by Expr.op=
6fa0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 77 69 74 68 20  =TK_COLUMN with 
6fb0: 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
6fc0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
6fd0: 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 6f  interfaces is no
6fe0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  t used by the st
6ff0: 61 6e 64 61 72 64 20 73 74 6f 72 61 67 65 20 65  andard storage e
7000: 6e 67 69 6e 65 20 6f 66 20 53 51 4c 69 74 65 2e  ngine of SQLite.
7010: 0a 2a 2a 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  .** It is only u
7020: 73 65 66 75 6c 20 74 6f 20 61 70 70 6c 69 63 61  seful to applica
7030: 74 69 6f 6e 20 74 68 61 74 20 72 65 70 6c 61 63  tion that replac
7040: 65 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74  e SQLite's built
7050: 2d 69 6e 20 73 74 6f 72 61 67 65 0a 2a 2a 20 65  -in storage.** e
7060: 6e 67 69 6e 65 20 77 69 74 68 20 74 68 65 69 72  ngine with their
7070: 20 6f 77 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   own..*/.void sq
7080: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7090: 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Hint(BtCursor *p
70a0: 43 75 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  Cur, int iTable,
70b0: 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78   const Expr *pEx
70c0: 70 72 29 7b 0a 20 20 2f 2a 20 41 6c 74 65 72 6e  pr){.  /* Altern
70d0: 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
70e0: 67 69 6e 65 73 20 6d 69 67 68 74 20 75 73 65 20  gines might use 
70f0: 74 68 69 73 2e 20 2a 2f 0a 7d 0a 23 65 6e 64 69  this. */.}.#endi
7100: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
7110: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 20  LE_CURSOR_HINTS 
7120: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7130: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7140: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
7150: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
7160: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
7170: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
7180: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
7190: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
71a0: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
71b0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
71c0: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
71d0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
71e0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
71f0: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
7200: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
7210: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
7220: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
7230: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7240: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
7250: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
7260: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
7270: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
7280: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
7290: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
72a0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
72b0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
72c0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
72d0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
72e0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
72f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7300: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7310: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
7320: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
7330: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
7340: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
7350: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
7360: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
7370: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
7380: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
7390: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
73a0: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
73b0: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
73c0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
73d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
73e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
73f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
7400: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7410: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
7420: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7430: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
7440: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7450: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
7460: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
7470: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
7480: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
7490: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
74a0: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
74b0: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
74c0: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
74d0: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
74e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
74f0: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
7500: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7510: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
7520: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
7530: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
7540: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
7550: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
7560: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7570: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
7580: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
7590: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
75a0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
75b0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
75c0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
75d0: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
75e0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
75f0: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
7600: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
7610: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7620: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7630: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7640: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7650: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7660: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
7670: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7680: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7690: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
76a0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
76b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
76c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
76d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
76e0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
76f0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7700: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7710: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7720: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7730: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7740: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7750: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7760: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7770: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7780: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7790: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
77a0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
77b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
77c0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
77d0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
77e0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
77f0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7800: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7810: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7820: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
7830: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7840: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7850: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7860: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7870: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7880: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7890: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
78a0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
78b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
78c0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
78d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
78e0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
78f0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7900: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7910: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7920: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7930: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7940: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7950: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7960: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7970: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7980: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7990: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
79a0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
79b0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
79c0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
79d0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
79e0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
79f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7a00: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7a10: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7a20: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7a30: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7a40: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7a50: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7a60: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7a70: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7a80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7a90: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7aa0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7ab0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7ac0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7ad0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7ae0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7af0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7b00: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7b10: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
7b20: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
7b30: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
7b40: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7b50: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
7b60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7b70: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7b80: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7b90: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7ba0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7bb0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7bc0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7bd0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7be0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7bf0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7c00: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7c10: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
7c20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
7c30: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
7c40: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
7c50: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
7c60: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
7c70: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7c80: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7c90: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7ca0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7cb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7cc0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7cd0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7ce0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7cf0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7d00: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7d10: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
7d20: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
7d30: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
7d40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7d50: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
7d60: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7d70: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7d80: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7d90: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7da0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7db0: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7dc0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7dd0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7de0: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7df0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7e00: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7e10: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7e20: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7e30: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
7e40: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
7e50: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
7e60: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
7e70: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
7e80: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
7e90: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7ea0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7eb0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7ec0: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7ed0: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7ee0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7ef0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7f00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7f10: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
7f20: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
7f30: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
7f40: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
7f50: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
7f60: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
7f70: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7f80: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
7f90: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7fa0: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7fb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7fc0: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7fd0: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7fe0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7ff0: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
8000: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
8010: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
8020: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
8030: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
8040: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
8050: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
8060: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
8070: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
8080: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
8090: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
80a0: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
80b0: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
80c0: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
80d0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
80e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
80f0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
8100: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
8110: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
8120: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
8130: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
8140: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
8150: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
8160: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8170: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8180: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8190: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
81a0: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
81b0: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
81c0: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
81d0: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
81e0: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
81f0: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
8200: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
8210: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
8220: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
8230: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
8240: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8250: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
8260: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
8270: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
8280: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
8290: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
82a0: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
82b0: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
82c0: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
82d0: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
82e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
82f0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
8300: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8310: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
8320: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
8330: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8340: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8350: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8360: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8380: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8390: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
83a0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
83b0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
83c0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
83d0: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
83e0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
83f0: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
8400: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8410: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
8420: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
8430: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
8440: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
8450: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
8460: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
8470: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
8480: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
8490: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
84a0: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
84b0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
84c0: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
84d0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
84e0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
84f0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
8500: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
8510: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
8520: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
8530: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
8540: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
8550: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
8560: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
8570: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
8580: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
8590: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
85a0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
85b0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
85c0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
85d0: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
85e0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
85f0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
8600: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
8610: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
8620: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
8630: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
8640: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
8650: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
8660: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8670: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
8680: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
8690: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
86a0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
86b0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
86c0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
86d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
86e0: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
86f0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8700: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
8710: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8720: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
8730: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
8740: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
8750: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8760: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
8770: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
8780: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8790: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
87a0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  o->iOverflow = (
87b0: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
87c0: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
87d0: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  cal] - pCell);. 
87e0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
87f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8800: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
8810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
8820: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
8830: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
8840: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
8850: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
8860: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
8870: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
8880: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
8890: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
88a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
88b0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
88c0: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
88d0: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
88e0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
88f0: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
8900: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
8910: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
8920: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8930: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
8940: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
8950: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
8960: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
8970: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
8980: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
8990: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
89a0: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
89b0: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
89c0: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
89d0: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
89e0: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
89f0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
8a00: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8a10: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
8a20: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8a30: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8a40: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8a50: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8a60: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8a70: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8a80: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
8a90: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
8aa0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
8ab0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
8ac0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
8ad0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8ae0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8af0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8b00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
8b10: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
8b20: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
8b30: 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74  load );.  assert
8b40: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
8b50: 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e  rSize==4 );.#ifn
8b60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8b70: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8b80: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
8b90: 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  if.  pInfo->nSiz
8ba0: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8bb0: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8bc0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8bd0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
8be0: 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  oad = 0;.  pInfo
8bf0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20  ->nLocal = 0;.  
8c00: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8c10: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70   = 0;.  pInfo->p
8c20: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72  Payload = 0;.  r
8c30: 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20  eturn;.}.static 
8c40: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8c50: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
8c60: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8c70: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8c80: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
8c90: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
8ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8cb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
8cc0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
8cd0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
8ce0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8cf0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8d00: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
8d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8d20: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
8d30: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
8d40: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
8d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8d60: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
8d70: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
8d80: 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20    u64 iKey;     
8d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
8da0: 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65  racted Key value
8db0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
8dc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8dd0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8de0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
8df0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
8e00: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
8e10: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
8e20: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8e30: 66 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61  f || pPage->noPa
8e40: 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72  yload );.  asser
8e50: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
8e60: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  oad==0 );.  asse
8e70: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
8e80: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
8e90: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
8ea0: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
8eb0: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
8ec0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
8ed0: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
8ee0: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
8ef0: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
8f00: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
8f10: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
8f20: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
8f30: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
8f40: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
8f50: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
8f60: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
8f70: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
8f80: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
8f90: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
8fa0: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
8fb0: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
8fc0: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
8fd0: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
8fe0: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
8ff0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
9000: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
9010: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9020: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9030: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
9040: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9050: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9060: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9070: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9080: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
9090: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
90a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
90b0: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
90c0: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
90d0: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
90e0: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
90f0: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
9100: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9110: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
9120: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
9130: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
9140: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
9150: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9160: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
9170: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
9180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
9190: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
91a0: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
91b0: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
91c0: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
91d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
91e0: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
91f0: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
9200: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
9210: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9220: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
9230: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
9240: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
9250: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9260: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9270: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
9280: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9290: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
92a0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
92b0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
92c0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
92d0: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
92e0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
92f0: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
9300: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
9310: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
9320: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
9330: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
9340: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
9350: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
9360: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
9370: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
9380: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
9390: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
93a0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
93b0: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
93c0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
93d0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65  erflow = 0;.  }e
93e0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
93f0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9400: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9410: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9420: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9430: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9440: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9450: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9460: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9470: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9480: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9490: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
94a0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
94b0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
94c0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
94d0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
94e0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
94f0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
9500: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
9510: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
9520: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9530: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9540: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9550: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9560: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9570: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9580: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9590: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
95a0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
95b0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
95c0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
95d0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
95e0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
95f0: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
9600: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
9610: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  oad==0 );.  pIte
9620: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
9630: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9640: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
9650: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9660: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9670: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9680: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9690: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
96a0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
96b0: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
96c0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
96d0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
96e0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
96f0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
9700: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
9710: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
9720: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
9730: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9740: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9750: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9760: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
9770: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9780: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
9790: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
97a0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
97b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
97c0: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
97d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
97e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
97f0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9800: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9810: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9820: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9830: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9840: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
9850: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
9860: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9870: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
9880: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9890: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
98a0: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
98b0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
98c0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
98d0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
98e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
98f0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  flow = 0;.  }els
9900: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9910: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9920: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9930: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9940: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9950: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9960: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
9970: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9980: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9990: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
99a0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
99b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
99c0: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
99d0: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
99e0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
99f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9a00: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9a10: 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e   */.){.  pPage->
9a20: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
9a30: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
9a40: 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29  , iCell), pInfo)
9a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
9a60: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9a70: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
9a80: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
9a90: 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a  Page.xCellSize.*
9aa0: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
9ab0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
9ac0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
9ad0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
9ae0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
9af0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
9b00: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
9b10: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
9b20: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
9b30: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
9b40: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
9b50: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
9b60: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
9b70: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
9b80: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
9b90: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
9ba0: 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  *.** cellSizePtr
9bb0: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d  NoPayload()    =
9bc0: 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e  >   table intern
9bd0: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c  al nodes.** cell
9be0: 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20  SizePtr()       
9bf0: 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69        =>   all i
9c00: 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62  ndex nodes & tab
9c10: 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f  le leaf nodes.*/
9c20: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
9c30: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
9c40: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9c50: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
9c60: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
9c70: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f  >childPtrSize; /
9c80: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9c90: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
9ca0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
9ce0: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33  a varint */.  u3
9cf0: 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  2 nSize;        
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76         /* Size v
9d20: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
9d30: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
9d40: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
9d50: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
9d60: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
9d70: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
9d80: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
9d90: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
9da0: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
9db0: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
9dc0: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
9dd0: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
9de0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
9df0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
9e00: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
9e10: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
9e20: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
9e30: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
9e40: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
9e50: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
9e60: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
9e70: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
9e80: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
9e90: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
9ea0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
9eb0: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d  Page->noPayload=
9ec0: 3d 30 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20  =0 );.  nSize = 
9ed0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
9ee0: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
9ef0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
9f00: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
9f10: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
9f20: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
9f30: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
9f40: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
9f50: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
9f60: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
9f70: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
9f80: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
9f90: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
9fa0: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
9fb0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
9fc0: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
9fd0: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
9fe0: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
9ff0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
a000: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
a010: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
a020: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
a030: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
a040: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a050: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
a060: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a070: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
a080: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a090: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a0a0: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
a0b0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a0c0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
a0d0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a0e0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a0f0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
a100: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a110: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
a120: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
a130: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
a140: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
a150: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a160: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
a170: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
a180: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a190: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
a1a0: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
a1b0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a1c0: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
a1d0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a1e0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a1f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a200: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a210: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
a220: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
a230: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a240: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a250: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
a260: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
a270: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a280: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
a290: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
a2a0: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
a2b0: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a2c0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
a2d0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a2e0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
a2f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a300: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a310: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a320: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
a330: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a340: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a350: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a360: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a370: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
a380: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a390: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
a3a0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
a3b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
a3c0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
a3d0: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
a3e0: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
a3f0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
a400: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
a410: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
a420: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
a430: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
a440: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
a450: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
a460: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
a470: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
a480: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
a490: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
a4a0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
a4b0: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
a4c0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a4d0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
a4e0: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
a4f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a500: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
a510: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a520: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
a530: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
a540: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
a550: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a560: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a570: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
a580: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
a590: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a5a0: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
a5b0: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a5c0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a5d0: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
a5e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
a5f0: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
a600: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
a610: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
a620: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
a630: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
a640: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
a650: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
a660: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
a670: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
a680: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
a690: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
a6a0: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
a6b0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
a6c0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
a6d0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
a6e0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
a6f0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
a700: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
a710: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
a720: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
a730: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
a740: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
a750: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
a760: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
a770: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
a780: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
a790: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a7a0: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
a7b0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
a7c0: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
a7d0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
a7e0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
a7f0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a800: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
a810: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
a820: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
a830: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
a840: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
a850: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
a860: 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50      ptrmapPut(pP
a870: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
a880: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
a890: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
a8a0: 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  RC);.  }.}.#endi
a8b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67  f.../*.** Defrag
a8c0: 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69  ment the page gi
a8d0: 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20  ven.  All Cells 
a8e0: 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
a8f0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70  .** end of the p
a900: 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65  age and all free
a910: 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63   space is collec
a920: 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20  ted into one.** 
a930: 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74  big FreeBlk that
a940: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
a950: 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  en the header an
a960: 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65  d cell.** pointe
a970: 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20  r array and the 
a980: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a990: 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43  a..**.** EVIDENC
a9a0: 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30  E-OF: R-44582-60
a9b0: 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66  138 SQLite may f
a9c0: 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65  rom time to time
a9d0: 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a   reorganize a.**
a9e0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20   b-tree page so 
a9f0: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
aa00: 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20  o freeblocks or 
aa10: 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20  fragment bytes, 
aa20: 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79  all.** unused by
aa30: 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  tes are containe
aa40: 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63  d in the unalloc
aa50: 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f  ated space regio
aa60: 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65  n, and all.** ce
aa70: 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74  lls are packed t
aa80: 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e  ightly at the en
aa90: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  d of the page..*
aaa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
aab0: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
aac0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
aad0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
aae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aaf0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
ab00: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
ab10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ab20: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
ab30: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
ab40: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
ab50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
ab60: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
ab70: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
ab80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab90: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
aba0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
abb0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
abc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
abd0: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
abe0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
abf0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
ac00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
ac10: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
ac20: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
ac30: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac50: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
ac60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
ac70: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
aca0: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
acb0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
acc0: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
acd0: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
ace0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
acf0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
ad00: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
ad10: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
ad20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ad30: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
ad40: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
ad50: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
ad60: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
ad70: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
ad80: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
ad90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
ada0: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
adb0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
adc0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
add0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
ade0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
adf0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
ae00: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ae10: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
ae20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ae30: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ae40: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
ae50: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
ae60: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ae70: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
ae80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ae90: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
aea0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
aeb0: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
aec0: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
aed0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
aee0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
aef0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
af00: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
af10: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
af20: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
af30: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
af40: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
af50: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
af60: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
af70: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
af80: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
af90: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
afa0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
afb0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
afc0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
afd0: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
afe0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
aff0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
b000: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
b010: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
b020: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
b030: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
b040: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
b050: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
b060: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b070: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b080: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b090: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
b0a0: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
b0b0: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
b0c0: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
b0d0: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
b0e0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
b0f0: 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65  PRAGMA cell_size
b100: 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a  _check=ON..    *
b110: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
b120: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
b130: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
b140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b150: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b160: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
b170: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
b180: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
b190: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
b1a0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b1b0: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
b1c0: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
b1d0: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
b1e0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
b1f0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
b200: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b210: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b220: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
b230: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
b240: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
b250: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b260: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b270: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
b280: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
b290: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
b2a0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b2b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
b2c0: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
b2d0: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
b2e0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
b2f0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
b300: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b310: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
b320: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
b330: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
b340: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
b350: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b360: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
b370: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
b380: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
b390: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
b3a0: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
b3b0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
b3c0: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
b3d0: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73   size);.  }.  as
b3e0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
b3f0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
b400: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b410: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
b420: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
b430: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
b440: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
b450: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
b460: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
b470: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
b480: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
b490: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b4a0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b4b0: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
b4c0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
b4d0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
b4e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b4f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b510: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b520: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
b530: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
b540: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
b550: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
b560: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
b570: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
b580: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
b590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b5a0: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
b5b0: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
b5c0: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
b5d0: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
b5e0: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
b5f0: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
b600: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
b610: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
b620: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
b630: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
b640: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
b650: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
b660: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
b670: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
b680: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
b690: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
b6a0: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
b6b0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
b6c0: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
b6d0: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
b6e0: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
b6f0: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
b700: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
b710: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
b720: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
b730: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
b740: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
b750: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
b760: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
b770: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
b780: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
b790: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
b7a0: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
b7b0: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
b7c0: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
b7d0: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
b7e0: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
b7f0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
b800: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
b810: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
b820: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
b830: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
b840: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
b850: 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
b860: 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pc>0 );.  do{.  
b870: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
b880: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b890: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
b8a0: 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  */.    /* EVIDEN
b8b0: 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33  CE-OF: R-06866-3
b8c0: 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20  9125 Freeblocks 
b8d0: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65  are always conne
b8e0: 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66  cted in order of
b8f0: 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69  .    ** increasi
b900: 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20  ng offset. */.  
b910: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
b920: 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64  ize-4 || pc<iAdd
b930: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  r+4 ){.      *pR
b940: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
b950: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
b960: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
b970: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
b980: 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38  F: R-22710-53328
b990: 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66   The third and f
b9a0: 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65  ourth bytes of e
b9b0: 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62  ach.    ** freeb
b9c0: 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d  lock form a big-
b9d0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
b9e0: 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65  hich is the size
b9f0: 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63   of the freebloc
ba00: 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65  k.    ** in byte
ba10: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  s, including the
ba20: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20   4-byte header. 
ba30: 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  */.    size = ge
ba40: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
ba50: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78  +2]);.    if( (x
ba60: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29   = size - nByte)
ba70: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
ba80: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
ba90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
baa0: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
bab0: 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f   pc < pPg->cellO
bac0: 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65  ffset+2*pPg->nCe
bad0: 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20  ll || size+pc > 
bae0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
baf0: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
bb00: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
bb10: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
bb20: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
bb30: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
bb40: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
bb50: 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32  F: R-11498-58022
bb60: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
bb70: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
bb80: 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20  he total.       
bb90: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79   ** number of by
bba0: 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73  tes in fragments
bbb0: 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20   may not exceed 
bbc0: 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  60. */.        i
bbd0: 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e  f( aData[hdr+7]>
bbe0: 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  57 ) return 0;..
bbf0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
bc00: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
bc10: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
bc20: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
bc30: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   of.        ** f
bc40: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
bc50: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
bc60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
bc70: 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  py(&aData[iAddr]
bc80: 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29  , &aData[pc], 2)
bc90: 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b  ;.        aData[
bca0: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
bcb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bcc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
bcd0: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
bce0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
bcf0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
bd00: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
bd10: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
bd20: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
bd30: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
bd40: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
bd50: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
bd60: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
bd70: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
bd80: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
bd90: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
bda0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bdb0: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
bdc0: 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a   }while( pc );..
bdd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
bde0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
bdf0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
be00: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
be10: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
be20: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
be30: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
be40: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
be50: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
be60: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
be70: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
be80: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
be90: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
bea0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
beb0: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
bec0: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
bed0: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
bee0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
bef0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
bf00: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
bf10: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
bf20: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
bf30: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
bf40: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
bf50: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
bf60: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
bf70: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
bf80: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
bf90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
bfa0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
bfb0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
bfc0: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
bfd0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
bfe0: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
bff0: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
c000: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
c010: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
c020: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
c030: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
c040: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
c050: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
c060: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
c070: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
c080: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
c090: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
c0a0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
c0b0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
c0c0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
c0d0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
c0e0: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
c0f0: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
c100: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
c110: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
c120: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c130: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
c140: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c170: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
c180: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
c190: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c1a0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
c1b0: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
c1c0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
c1d0: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
c1e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c1f0: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
c200: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
c210: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
c220: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
c230: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c240: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c250: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
c260: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
c270: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c280: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c290: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c2a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c2b0: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
c2c0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
c2d0: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
c2e0: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
c2f0: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
c300: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
c310: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
c320: 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74  rt( nByte < (int
c330: 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  )(pPage->pBt->us
c340: 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a  ableSize-8) );..
c350: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c360: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
c370: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
c380: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
c390: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
c3a0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
c3b0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
c3c0: 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20   gap<=65536 );. 
c3d0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c3e0: 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49   R-29356-02391 I
c3f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  f the database u
c400: 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65  ses a 65536-byte
c410: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20   page size.  ** 
c420: 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64  and the reserved
c430: 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28   space is zero (
c440: 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20  the usual value 
c450: 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61  for reserved spa
c460: 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ce).  ** then th
c470: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  e cell content o
c480: 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74  ffset of an empt
c490: 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20  y page wants to 
c4a0: 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48  be 65536..  ** H
c4b0: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74  owever, that int
c4c0: 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67  eger is too larg
c4d0: 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69  e to be stored i
c4e0: 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67  n a 2-byte unsig
c4f0: 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  ned.  ** integer
c500: 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20  , so a value of 
c510: 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73  0 is used in its
c520: 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70   place. */.  top
c530: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c540: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73  a[hdr+5]);.  ass
c550: 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70  ert( top<=(int)p
c560: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c570: 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76  eSize ); /* Prev
c580: 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69  ent by getAndIni
c590: 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28  tPage() */.  if(
c5a0: 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20   gap>top ){.    
c5b0: 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50  if( top==0 && pP
c5c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
c5d0: 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20  Size==65536 ){. 
c5e0: 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36       top = 65536
c5f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c600: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c610: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c620: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
c630: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
c640: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
c650: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
c660: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
c670: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
c680: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
c690: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
c6a0: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
c6b0: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
c6c0: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
c6d0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
c6e0: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
c6f0: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
c700: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
c710: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
c720: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
c730: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
c740: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c750: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
c760: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
c770: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
c780: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
c790: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
c7a0: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
c7b0: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
c7c0: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
c7d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c7e0: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
c7f0: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
c800: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
c810: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
c820: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
c830: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c840: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
c850: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c860: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
c870: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
c880: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
c890: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
c8a0: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
c8b0: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
c8c0: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
c8d0: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
c8e0: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
c8f0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
c900: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
c910: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
c920: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
c930: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
c940: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
c950: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
c960: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
c970: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c980: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
c990: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
c9a0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
c9b0: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
c9c0: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
c9d0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
c9e0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
c9f0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
ca00: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
ca10: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
ca20: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
ca30: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
ca40: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
ca50: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
ca60: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
ca70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
ca80: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
ca90: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
caa0: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
cab0: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
cac0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
cad0: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
cae0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
caf0: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
cb00: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
cb10: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
cb20: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
cb30: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
cb40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
cb50: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
cb60: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
cb70: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
cb80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
cb90: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
cba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cbb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
cbc0: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
cbd0: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
cbe0: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
cbf0: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
cc00: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
cc10: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
cc20: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
cc30: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
cc40: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
cc50: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
cc60: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
cc70: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
cc80: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
cc90: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
cca0: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
ccb0: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
ccc0: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
ccd0: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
cce0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
ccf0: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
cd00: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
cd10: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
cd20: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
cd30: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
cd40: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
cd50: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
cd60: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
cd70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cd80: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
cd90: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
cda0: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
cdb0: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
cdc0: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
cdd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
cde0: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
cdf0: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
ce00: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
ce10: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ce20: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
ce30: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
ce40: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
ce70: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
ce80: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
ce90: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
cec0: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
ced0: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
cf00: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
cf10: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
cf20: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
cf50: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
cf60: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
cf70: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf90: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
cfa0: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
cfb0: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
cfc0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
cfd0: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
cfe0: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
cff0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
d000: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
d010: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
d020: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d030: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
d040: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
d050: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
d060: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
d070: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
d080: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
d090: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
d0a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d0b0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
d0c0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
d0d0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
d0e0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
d0f0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
d100: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
d110: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
d120: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d130: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
d140: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
d150: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
d160: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d170: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d180: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d190: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
d1a0: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
d1b0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
d1c0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
d1d0: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
d1e0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
d1f0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
d200: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
d210: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
d220: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
d230: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
d240: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
d250: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
d260: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
d270: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
d280: 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
d290: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
d2a0: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
d2b0: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
d2c0: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
d2d0: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
d2e0: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
d2f0: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
d300: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
d310: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
d320: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
d330: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
d340: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
d350: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
d360: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
d370: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
d380: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
d390: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
d3a0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
d3b0: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
d3c0: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
d3d0: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
d3e0: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
d3f0: 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c  )>0 && iFreeBlk<
d400: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
d410: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
d420: 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+4 ) return SQL
d430: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d440: 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  ;.      iPtr = i
d450: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
d460: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
d470: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
d480: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d490: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
d4a0: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
d4b0: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
d4c0: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
d4d0: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
d4e0: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
d4f0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
d500: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
d510: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
d520: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
d530: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
d540: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
d550: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
d560: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
d570: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
d580: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
d590: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
d5a0: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
d5b0: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
d5c0: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
d5d0: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
d5e0: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
d5f0: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
d600: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
d610: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d620: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d630: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
d640: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
d650: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
d660: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
d670: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
d680: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
d690: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d6a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d6b0: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
d6c0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
d6d0: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d6e0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
d6f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
d700: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
d710: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
d720: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
d730: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
d740: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
d750: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
d760: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
d770: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
d780: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
d790: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
d7a0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
d7b0: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
d7c0: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
d7d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
d7e0: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
d7f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
d800: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
d810: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
d820: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
d830: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
d840: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d850: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d860: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
d870: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
d880: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
d890: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
d8a0: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
d8b0: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
d8c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
d8d0: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
d8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d8f0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d900: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
d910: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
d920: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
d930: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
d940: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
d950: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
d960: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
d970: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
d980: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
d990: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
d9a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d9b0: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
d9c0: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
d9d0: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
d9e0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
d9f0: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
da00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
da10: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
da20: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
da30: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
da40: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
da50: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
da60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
da70: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
da80: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
da90: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
daa0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
dab0: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
dac0: 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  t);.    put2byte
dad0: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
dae0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
daf0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
db00: 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
db10: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
db20: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
db30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
db40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
db50: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
db60: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
db70: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
db80: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
db90: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
dba0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
dbb0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
dbc0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
dbd0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
dbe0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
dbf0: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
dc00: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
dc10: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
dc20: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
dc30: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
dc40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
dc50: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
dc60: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
dc70: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
dc80: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
dc90: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
dca0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
dcb0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
dcc0: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
dcd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
dce0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
dcf0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
dd00: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
dd10: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
dd20: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
dd30: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
dd40: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
dd50: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
dd60: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
dd70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
dd80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
dd90: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
dda0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
ddb0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
ddc0: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
ddd0: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
dde0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
ddf0: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
de00: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
de10: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
de20: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
de30: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
de40: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
de50: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
de60: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
de70: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
de80: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
de90: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
dea0: 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35  F: R-03640-13415
deb0: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65   A value of 5 me
dec0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
ded0: 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20  an interior.    
dee0: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
def0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
df00: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
df10: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
df20: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
df30: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31  ENCE-OF: R-20501
df40: 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f  -61796 A value o
df50: 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70  f 13 means the p
df60: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
df70: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
df80: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
df90: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
dfa0: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c  DATA|PTF_INTKEY|
dfb0: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b  PTF_LEAF)==13 );
dfc0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
dfd0: 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ey = 1;.    if( 
dfe0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
dff0: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
e000: 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20  eyLeaf = 1;.    
e010: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
e020: 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ad = 0;.      pP
e030: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e040: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e050: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
e060: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
e070: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e080: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
e090: 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  oad = 1;.      p
e0a0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
e0b0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
e0c0: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
e0d0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e0e0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e0f0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
e100: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
e110: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
e120: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
e130: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
e140: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
e150: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
e160: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
e170: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e180: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
e190: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
e1a0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
e1b0: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
e1c0: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
e1d0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
e1e0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
e1f0: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
e200: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e210: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
e220: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
e230: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
e240: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
e250: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
e260: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e270: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
e280: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
e290: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
e2a0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e2b0: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e2c0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
e2d0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
e2e0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e2f0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e300: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
e310: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e320: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
e330: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e340: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
e350: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
e360: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e370: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
e380: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
e390: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
e3a0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
e3b0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
e3c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e3d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e3e0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
e3f0: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
e400: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
e410: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
e420: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e430: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e440: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
e450: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
e460: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
e480: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
e490: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
e4a0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
e4b0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
e4c0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
e4d0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
e4e0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
e4f0: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
e500: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
e510: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
e520: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
e530: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
e540: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
e550: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
e560: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
e570: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
e580: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
e590: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
e5a0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
e5b0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
e5c0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
e5d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e5e0: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
e5f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e600: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e610: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e620: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e630: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
e640: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
e650: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e660: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e670: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
e680: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e690: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e6a0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
e6b0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
e6c0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
e6d0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
e6e0: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
e6f0: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
e700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e710: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
e720: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
e730: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
e740: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
e750: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
e760: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
e770: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
e780: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
e790: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
e7a0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
e7b0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
e7c0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
e7d0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
e7e0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
e7f0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
e800: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
e810: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
e820: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
e830: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
e840: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
e850: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
e860: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
e870: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
e880: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
e890: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
e8a0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
e8b0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
e8c0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
e8d0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
e8e0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
e8f0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
e900: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
e910: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
e920: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
e930: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
e940: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
e950: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
e960: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
e970: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
e980: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
e990: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
e9a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
e9b0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
e9c0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
e9d0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
e9e0: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
e9f0: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
ea00: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
ea10: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
ea20: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
ea30: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
ea40: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
ea50: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
ea60: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
ea70: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ea80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
ea90: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
eaa0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
eab0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
eac0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
ead0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
eae0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
eaf0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
eb00: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
eb10: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
eb20: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
eb30: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
eb40: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
eb50: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
eb60: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
eb70: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
eb80: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
eb90: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
eba0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
ebb0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
ebc0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ebd0: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ebe0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ebf0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
ec00: 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
ec10: 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
ec20: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
ec30: 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
ec40: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
ec50: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec60: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
ec70: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
ec80: 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a  nteger is.    **
ec90: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
eca0: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f  65536. */.    to
ecb0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ecc0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ecd0: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
ece0: 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
ecf0: 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
ed00: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
ed10: 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
ed20: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
ed30: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
ed40: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ge. */.    pPage
ed50: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
ed60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
ed70: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
ed80: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
ed90: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
eda0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
edb0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
edc0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
edd0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
ede0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
edf0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ee00: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
ee10: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
ee20: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
ee30: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
ee40: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
ee50: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
ee60: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
ee70: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
ee80: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66     ** possible f
ee90: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
eea0: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
eeb0: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
eec0: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
eed0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
eee0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
eef0: 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
ef00: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
ef10: 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  the.    ** bytes
ef20: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
ef30: 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ce. */.    asser
ef40: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
ef50: 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
ef60: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
ef70: 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  DB );..    /* A 
ef80: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
ef90: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
efa0: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
efb0: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
efc0: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
efd0: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
efe0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
eff0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f000: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
f010: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
f020: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
f030: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
f040: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
f050: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
f060: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
f070: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
f080: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
f090: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
f0a0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
f0b0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
f0c0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
f0d0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
f0e0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69  eSize - 4;.    i
f0f0: 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
f100: 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
f110: 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69  izeCk ){.      i
f120: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f130: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
f140: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f150: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
f160: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
f170: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
f180: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
f190: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f1a0: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
f1b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f1c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
f1d0: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
f1e0: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
f1f0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
f200: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
f210: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f220: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
f230: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
f240: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
f250: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f260: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f270: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f280: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f290: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f2a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2b0: 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
f2c0: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
f2d0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f2e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
f2f0: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
f300: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f310: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
f320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f330: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f340: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f350: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f360: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f370: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
f380: 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a  .    }  ..    /*
f390: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
f3a0: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
f3b0: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
f3c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f3d0: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
f3e0: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f3f0: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
f400: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
f410: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
f420: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
f430: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
f440: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
f450: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
f460: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
f470: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f480: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
f490: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
f4a0: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
f4b0: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
f4c0: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
f4d0: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
f4e0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f4f0: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
f500: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f510: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f520: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f530: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f540: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f550: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f560: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f570: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f580: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f590: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f5a0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f5b0: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f5c0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f5d0: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
f5e0: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
f5f0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
f600: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f610: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f620: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
f640: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
f650: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
f660: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
f670: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
f680: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
f690: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
f6a0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
f6b0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f6c0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
f6d0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
f6e0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
f6f0: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
f700: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
f710: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
f720: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
f730: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
f740: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
f750: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f760: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
f770: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
f780: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
f790: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
f7a0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
f7b0: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
f7c0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
f7d0: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
f7e0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
f7f0: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
f800: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
f810: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
f820: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
f830: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
f840: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
f850: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
f860: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
f870: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
f880: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
f890: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
f8a0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
f8b0: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
f8c0: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
f8d0: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
f8e0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
f8f0: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
f900: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
f910: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
f920: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
f930: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
f940: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
f950: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
f960: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
f970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f980: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
f990: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
f9a0: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
f9b0: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
f9c0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
f9d0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
f9e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f9f0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
fa00: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
fa10: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
fa20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
fa30: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
fa40: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
fa50: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
fa60: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
fa70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
fa80: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
fa90: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
faa0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fab0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
fac0: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
fad0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
fae0: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
faf0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
fb00: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
fb10: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
fb20: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
fb30: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
fb40: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
fb50: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
fb60: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
fb70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
fb80: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
fb90: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
fba0: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
fbb0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
fbc0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
fbd0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
fbe0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fbf0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
fc00: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
fc10: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
fc20: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
fc30: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
fc40: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
fc50: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
fc60: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
fc70: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
fc80: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
fc90: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
fca0: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
fcb0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
fcc0: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
fcd0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
fce0: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
fcf0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
fd00: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
fd10: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
fd20: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
fd30: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
fd40: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
fd50: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
fd60: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
fd70: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
fd80: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
fd90: 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
fda0: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
fdb0: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
fdc0: 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
fdd0: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
fde0: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
fdf0: 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
fe00: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
fe10: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
fe20: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
fe30: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
fe40: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
fe50: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
fe60: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
fe70: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
fe80: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
fe90: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
fea0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
feb0: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
fec0: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
fed0: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
fee0: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
fef0: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
ff00: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
ff10: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
ff20: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
ff30: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
ff40: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ff50: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
ff60: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
ff70: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
ff80: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
ff90: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
ffa0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
ffb0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
ffc0: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
ffd0: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
ffe0: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
fff0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
10000 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
10010 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
10020 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
10030 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
10040 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10050 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
10060 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
10070 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
10080 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
10090 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
100a0 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74  d.  See also: bt
100b0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
100c0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
100d0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
100e0 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74  TENT flag is set
100f0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
10100 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a  we do not care.*
10110 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  * about the cont
10120 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
10130 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
10140 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
10150 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
10160 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
10170 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
10180 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
10190 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
101a0 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
101b0 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
101c0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
101d0 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
101e0 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
101f0 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
10200 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
10210 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
10220 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
10230 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
10240 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
10250 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
10260 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10270 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
10280 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
10290 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
102a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
102b0 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
102c0 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
102d0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
102e0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
102f0 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
10300 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
10310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10320 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10330 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
10340 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
10350 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
10360 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
10370 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
10380 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
10390 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
103a0 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
103b0 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
103c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
103d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
103e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
103f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
10400 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
10410 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10420 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
10430 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
10440 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
10450 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
10460 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
10470 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
10480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10490 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
104a0 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
104b0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
104c0 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
104d0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
104e0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
104f0 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
10500 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
10510 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
10520 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
10530 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
10540 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
10550 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
10560 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
10570 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
10580 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
10590 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
105a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
105b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
105c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
105d0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
105e0 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
105f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
10600 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
10610 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
10620 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10630 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10640 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10650 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
10660 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
10670 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10680 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
10690 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
106a0 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
106b0 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
106c0 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
106d0 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
106e0 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
106f0 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
10700 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
10710 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
10720 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
10730 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10740 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10750 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
10760 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
10770 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
10780 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
10790 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
107a0 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
107b0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
107c0 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
107d0 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
107e0 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
107f0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
10800 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
10810 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
10820 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
10830 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
10840 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
10850 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
10860 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
10870 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
10880 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10890 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
108a0 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
108b0 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
108c0 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
108d0 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
108e0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
108f0 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
10900 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
10910 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10920 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
10930 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
10940 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
10950 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
10960 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
10970 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
10980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
10990 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
109a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
109d0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
109e0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
109f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10a00 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
10a10 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
10a20 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a40 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
10a50 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
10a60 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
10a90 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
10aa0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
10ab0 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ad0 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
10ae0 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
10af0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
10b00 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
10b10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10b20 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10b30 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10b40 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
10b50 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
10b60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
10b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10b80 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
10b90 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
10ba0 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
10bb0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10bc0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
10bd0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
10be0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
10bf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10c00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10c10 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
10c20 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
10c30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10c40 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
10c50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
10c60 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
10c70 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
10c80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
10c90 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
10ca0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
10cb0 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  }.  *ppPage = bt
10cc0 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
10cd0 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
10ce0 20 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a 70   pBt);.  if( (*p
10cf0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
10d00 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  0 ){.    rc = bt
10d10 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
10d20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
10d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10d40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
10d50 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
10d60 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
10d70 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
10d80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  }.  }..  /* If o
10d90 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
10da0 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
10db0 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
10dc0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
10dd0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
10de0 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
10df0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
10e00 20 70 43 75 72 0a 20 20 20 26 26 20 28 28 2a 70   pCur.   && ((*p
10e10 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20  pPage)->nCell<1 
10e20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e  || (*ppPage)->in
10e30 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49  tKey!=pCur->curI
10e40 6e 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20  ntKey).  ){.    
10e50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
10e60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
10e70 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
10e80 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
10e90 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
10ea0 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
10eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
10ec0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
10ed0 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70  :.  if( pCur ) p
10ee0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
10ef0 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
10f00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
10f10 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
10f20 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
10f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10f40 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
10f50 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
10f60 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
10f70 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
10f80 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
10f90 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
10fa0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
10fb0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d  asePageNotNull(M
10fc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
10fd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
10fe0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
10ff0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
11000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11010 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
11020 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11030 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11040 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11050 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
11060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11070 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11080 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11090 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
110a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
110b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
110c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
110d0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
110e0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
110f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
11100 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
11110 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
11120 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
11130 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73  ( pPage ) releas
11140 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
11150 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
11160 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
11170 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
11180 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
11190 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
111a0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
111b0 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
111c0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
111d0 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
111e0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
111f0 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
11200 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
11210 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
11220 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
11230 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
11240 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
11250 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
11260 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
11270 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
11280 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
11290 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
112a0 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
112b0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
112c0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
112d0 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
112e0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
112f0 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
11300 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
11310 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
11320 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
11330 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
11340 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
11350 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
11360 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
11370 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
11380 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
11390 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
113a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
113b0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
113c0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
113d0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
113e0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
113f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11400 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
11410 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
11420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11430 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11440 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
11450 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
11460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
11470 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
11480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
11490 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
114a0 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
114b0 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
114c0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
114d0 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
114e0 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
114f0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11500 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
11510 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
11520 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
11530 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
11540 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
11550 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11560 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
11570 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
11580 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
11590 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
115a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
115b0 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
115c0 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
115d0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
115e0 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
115f0 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
11600 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11610 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
11620 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
11630 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
11640 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
11650 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11660 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
11670 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
11680 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
11690 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
116a0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
116b0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
116c0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
116d0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
116e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
116f0 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
11700 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
11710 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
11720 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
11730 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
11740 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
11750 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
11760 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
11770 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
11780 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
11790 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
117a0 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
117b0 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
117c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
117d0 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
117e0 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
117f0 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
11800 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
11810 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
11820 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
11830 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
11840 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
11850 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
11860 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
11870 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
11880 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
11890 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
118a0 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
118b0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
118c0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
118d0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
118e0 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
118f0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
11900 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
11910 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
11920 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
11930 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
11940 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
11950 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
11960 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11970 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11980 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11990 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
119a0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
119b0 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
119c0 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
119d0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
119e0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
119f0 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
11a00 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
11a10 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
11a20 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
11a30 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
11a40 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
11a50 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
11a60 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11a70 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
11a80 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
11a90 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
11aa0 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
11ab0 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
11ac0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
11ad0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
11ae0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
11af0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11b00 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
11b10 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
11b20 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
11b30 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
11b40 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
11b50 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
11b60 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
11b70 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
11b80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
11b90 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
11ba0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
11bb0 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
11bc0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
11bd0 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
11be0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
11bf0 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
11c00 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
11c10 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
11c20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
11c30 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
11c40 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
11c50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11c60 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
11c70 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
11c80 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
11c90 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
11ca0 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
11cb0 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
11cc0 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
11cd0 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
11ce0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
11cf0 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
11d00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11d10 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
11d20 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
11d30 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
11d40 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
11d50 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
11d60 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
11d70 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
11d80 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
11d90 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
11da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
11db0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
11dc0 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
11dd0 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
11de0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
11df0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11e00 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
11e10 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
11e20 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
11e30 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
11e40 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
11e50 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
11e60 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
11e70 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
11e90 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
11ea0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
11eb0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
11ec0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
11ed0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
11ee0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
11ef0 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
11f00 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
11f10 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
11f20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
11f30 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f50 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
11f60 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
11f70 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
11f80 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
11f90 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
11fa0 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
11fb0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11fc0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11fd0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11fe0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
11ff0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
12000 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
12010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12020 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
12030 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
12040 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
12050 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
12060 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
12070 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
12080 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
12090 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
120a0 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
120b0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
120c0 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
120d0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
120e0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
120f0 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
12100 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
12110 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
12120 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
12130 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
12140 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
12150 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
12160 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
12170 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
12180 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
12190 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
121a0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
121b0 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
121c0 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
121d0 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
121e0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12200 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
12210 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
12220 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12240 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
12250 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
12260 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
12270 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
12280 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
12290 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
122a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
122b0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
122c0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
122d0 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
122e0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
122f0 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
12300 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
12310 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
12320 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
12330 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
12340 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
12350 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
12360 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
12370 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
12380 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
12390 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
123a0 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
123b0 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
123c0 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
123d0 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
123e0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
123f0 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
12400 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
12410 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
12420 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
12430 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
12440 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12450 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
12460 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
12470 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
12480 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
12490 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
124a0 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
124b0 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
124c0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
124d0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
124e0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
124f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12500 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12510 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
12520 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
12530 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
12540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12550 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
12560 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
12570 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
12580 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
12590 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
125a0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
125b0 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
125c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
125d0 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
125e0 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
125f0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
12600 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
12610 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
12620 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
12630 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
12640 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
12650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
12660 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
12670 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
12680 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
12690 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
126a0 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
126b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
126c0 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
126d0 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
126e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
126f0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
12700 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
12710 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
12720 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
12730 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
12740 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
12750 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
12760 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
12770 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
12780 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
12790 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
127a0 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
127b0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
127c0 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
127d0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
127e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
127f0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12800 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12820 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
12830 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
12840 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
12850 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29  name, nFilename)
12860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12870 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12880 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
12890 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
128a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e        nFullPathn
128d0 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
128e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
128f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
12900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
12910 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
12920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12930 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
12940 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12960 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
12970 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65  DSAFE.      mute
12980 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
12990 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
129a0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
129b0 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
129c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
129d0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
129e0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
129f0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12a00 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12a10 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
12a20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12a30 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
12a40 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  red);.#endif.   
12a50 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
12a60 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
12a70 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
12a80 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
12a90 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
12aa0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12ab0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
12ac0 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
12ad0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
12ae0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
12af0 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ame(pBt->pPager,
12b00 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
12b10 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12b20 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
12b30 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
12b40 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
12b50 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
12b60 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
12b70 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
12b80 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
12b90 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
12ba0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12bc0 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
12bd0 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
12be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12bf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12c00 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12c10 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
12c20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12c30 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
12c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
12c60 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12c70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12c80 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
12c90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12ca0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12cb0 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
12cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
12cd0 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
12ce0 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
12cf0 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
12d00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12d30 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
12d40 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
12d50 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
12d60 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
12d70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12d80 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
12d90 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
12da0 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
12db0 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
12dc0 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
12dd0 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
12de0 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
12df0 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
12e00 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
12e10 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
12e20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
12e30 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
12e40 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
12e50 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
12e60 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
12e70 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
12e80 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
12e90 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
12ea0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
12eb0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
12ec0 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
12ed0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
12ee0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
12ef0 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
12f00 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
12f10 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
12f20 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
12f30 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
12f40 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
12f50 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
12f60 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
12f70 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
12f80 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
12f90 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
12fa0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
12fb0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
12fc0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
12fd0 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
12fe0 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
12ff0 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
13000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13010 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
13020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
13030 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
13040 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
13050 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13060 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
13070 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
13080 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13090 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
130a0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
130b0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
130c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
130d0 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
130e0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
130f0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
13120 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
13130 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
13140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13150 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13160 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
13170 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
13180 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
13190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
131a0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
131b0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
131c0 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
131d0 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
131e0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
131f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13200 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
13210 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
13220 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
13230 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
13240 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
13250 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13260 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
13270 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
13280 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13290 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
132a0 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
132b0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
132c0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
132d0 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
132e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
132f0 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
13300 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
13310 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13320 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
13330 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
13340 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  E.    pBt->btsFl
13350 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
13360 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
13370 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
13380 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
13390 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
133a0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
133b0 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
133c0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
133d0 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
133e0 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
133f0 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
13400 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
13410 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
13420 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
13430 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   */.    pBt->pag
13440 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
13450 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
13460 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
13470 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
13480 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
13490 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
134a0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
134b0 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
134c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
134d0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
134e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
134f0 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
13500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13510 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13520 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
13530 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
13540 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
13550 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
13560 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
13570 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
13580 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
13590 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
135a0 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
135b0 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
135c0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
135d0 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
135e0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
135f0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
13600 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
13610 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
13620 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
13630 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
13640 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
13650 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
13660 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
13670 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
13680 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
13690 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
136a0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
136b0 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
136c0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
136d0 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
136e0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
136f0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
13700 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13710 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
13720 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
13730 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13740 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13750 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
13760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13770 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
13780 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
13790 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
137a0 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
137b0 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69        ** determi
137c0 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
137d0 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
137e0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
137f0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
13800 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
13810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
13820 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  ader. */.      n
13830 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
13840 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
13850 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13860 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13870 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
13880 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13890 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
138a0 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
138b0 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
138c0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
138d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
138e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
138f0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
13900 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
13910 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
13920 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13930 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
13940 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
13950 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
13960 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
13970 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
13980 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
13990 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
139a0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
139b0 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
139c0 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
139d0 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
139e0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
139f0 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
13a00 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
13a10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13a20 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13a30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13a40 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
13a50 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
13a60 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
13a70 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
13a80 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
13a90 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
13aa0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
13ab0 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   ){.      MUTEX_
13ac0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13ad0 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13ae0 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e  d; ).      pBt->
13af0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
13b00 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
13b10 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
13b20 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13b30 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13b40 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
13b50 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
13b60 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
13b70 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
13b80 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
13b90 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
13ba0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
13bb0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
13bc0 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
13bd0 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
13be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
13bf0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13c00 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
13c10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
13c20 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
13c30 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13c50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13c60 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13c70 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13c80 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
13c90 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13ca0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13cb0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
13cc0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13cd0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13ce0 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
13cf0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13d00 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13d10 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
13d20 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
13d30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13d40 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13d50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13d60 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13d70 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
13d80 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
13d90 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
13da0 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
13db0 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
13dc0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
13dd0 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
13de0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
13df0 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
13e00 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
13e10 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
13e20 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
13e30 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
13e40 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
13e50 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
13e60 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
13e70 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
13e80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
13e90 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
13ea0 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
13eb0 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
13ec0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
13ed0 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
13ee0 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
13ef0 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
13f00 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
13f10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
13f20 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
13f30 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13f40 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
13f50 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
13f60 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
13f70 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
13f80 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
13f90 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
13fa0 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
13fb0 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
13fc0 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
13fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13fe0 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
13ff0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
14000 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
14010 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
14020 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
14030 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
14040 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
14050 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14060 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
14070 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
14080 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
14090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
140a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
140b0 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
140c0 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
140d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
140e0 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
140f0 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
14100 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14110 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
14120 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
14130 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
14140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14150 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
14160 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
14170 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
14180 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
14190 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
141a0 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
141b0 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
141c0 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
141d0 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
141e0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
141f0 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
14200 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
14210 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
14220 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
14230 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
14240 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14250 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
14260 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
14270 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14280 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
14290 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
142a0 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
142b0 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IZE);.    }.  }.
142c0 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
142d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
142e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
142f0 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
14300 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14310 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14320 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
14330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
14340 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
14350 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
14360 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
14370 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
14380 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
14390 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
143a0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
143b0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
143c0 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
143d0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
143e0 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
143f0 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
14400 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
14410 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
14420 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
14430 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
14440 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
14450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14460 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14470 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14480 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
14490 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
144a0 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
144b0 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
144c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
144d0 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
144e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
144f0 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
14500 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
14510 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
14520 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
14530 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
14540 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
14550 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
14560 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
14570 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
14580 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
14590 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
145a0 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
145b0 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
145c0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
145d0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
145e0 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
145f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14600 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
14610 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14620 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14630 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
14640 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14650 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
14660 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
14670 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
14680 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
14690 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
146a0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
146b0 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
146c0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
146d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
146e0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
146f0 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
14700 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
14710 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
14720 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
14730 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14740 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
14750 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
14760 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
14770 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
14780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14790 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
147a0 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
147b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
147c0 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
147d0 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
147e0 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
147f0 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
14800 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
14810 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
14820 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
14830 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14840 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
14850 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
14860 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
14870 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
14880 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
14890 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
148a0 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
148b0 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
148c0 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
148d0 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
148e0 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
148f0 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
14900 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
14910 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
14920 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
14930 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
14940 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
14950 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
14960 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
14970 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
14980 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
14990 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
149a0 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
149b0 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
149c0 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
149d0 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
149e0 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
149f0 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
14a00 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
14a10 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
14a20 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
14a30 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
14a40 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
14a50 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
14a60 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
14a70 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
14a80 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
14a90 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
14aa0 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
14ab0 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
14ac0 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
14ad0 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
14ae0 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
14af0 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
14b00 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
14b10 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
14b20 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
14b30 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
14b40 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
14b50 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
14b60 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
14b70 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
14b80 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
14b90 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
14ba0 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
14bb0 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
14bc0 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
14bd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
14be0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
14bf0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
14c00 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
14c10 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
14c20 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
14c30 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
14c40 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
14c50 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
14c60 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
14c70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
14c80 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
14c90 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
14ca0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
14cb0 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
14cc0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
14cd0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14ce0 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
14cf0 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
14d00 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
14d10 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
14d20 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
14d30 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
14d40 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
14d50 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
14d60 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
14d70 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
14d80 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
14d90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14da0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
14db0 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
14dc0 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
14dd0 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
14de0 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
14df0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14e00 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
14e10 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
14e20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14e30 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
14e40 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
14e50 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
14e60 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
14e70 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
14e80 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
14e90 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
14ea0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14eb0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
14ec0 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
14ed0 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
14ee0 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
14ef0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
14f00 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
14f10 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
14f20 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
14f30 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
14f40 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
14f50 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
14f60 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
14f70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
14f80 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
14f90 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
14fa0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14fb0 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
14fc0 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
14fd0 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
14fe0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
14ff0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
15000 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
15010 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
15020 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
15030 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
15040 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
15050 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
15060 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
15070 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
15080 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
15090 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
150a0 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
150b0 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
150c0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
150d0 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
150e0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
150f0 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
15100 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
15110 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
15120 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
15130 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
15140 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
15150 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
15160 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
15170 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
15180 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
15190 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
151a0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
151b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
151c0 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
151d0 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
151e0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
151f0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
15200 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
15210 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
15220 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
15230 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
15240 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
15250 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
15260 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15270 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15280 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
15290 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
152a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
152b0 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
152c0 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
152d0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
152e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
152f0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
15300 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
15310 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
15320 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
15330 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15340 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
15350 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
15360 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
15370 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
15380 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
15390 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
153a0 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
153b0 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
153c0 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
153d0 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
153e0 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
153f0 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
15400 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
15410 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
15420 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
15430 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
15440 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
15450 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
15460 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
15470 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
15480 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
15490 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
154a0 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
154b0 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
154c0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
154d0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
154e0 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
154f0 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
15500 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
15510 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
15520 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
15530 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
15540 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
15550 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
15560 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
15570 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
15580 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
15590 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
155a0 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
155b0 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
155c0 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
155d0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
155e0 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
155f0 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
15600 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15610 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
15620 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
15630 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
15640 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15650 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15660 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15670 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15680 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15690 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
156a0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
156b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
156c0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
156d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
156e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
156f0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
15700 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15710 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15720 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
15730 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15740 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15750 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15760 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15770 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15780 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15790 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
157a0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
157b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
157c0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
157d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
157e0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
157f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15800 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15810 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
15820 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
15830 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15840 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15850 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15860 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15870 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15880 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15890 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
158a0 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
158b0 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
158c0 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
158d0 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
158e0 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
158f0 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15900 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15910 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15920 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15930 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15940 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15950 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15960 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15970 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15980 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15990 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
159a0 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
159b0 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
159c0 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
159d0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
159e0 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
159f0 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15a00 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15a10 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15a20 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15a30 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15a40 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15a50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15a60 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15a70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15a80 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15a90 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15aa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15ab0 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15ac0 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15ad0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15ae0 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15af0 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15b00 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15b10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15b20 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15b30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15b40 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15b50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15b60 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15b70 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
15b80 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
15b90 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
15ba0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15bc0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
15bd0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15be0 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
15bf0 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
15c00 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
15c10 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
15c20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
15c30 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
15c40 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
15c50 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
15c60 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
15c70 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
15c80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15c90 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
15ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15cb0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15cc0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
15cd0 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
15ce0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
15cf0 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
15d00 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
15d10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
15d20 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
15d30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15d40 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15d60 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
15d70 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
15d80 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
15d90 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
15da0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
15db0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
15dc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15dd0 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
15de0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
15df0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
15e00 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
15e10 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
15e20 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
15e30 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
15e40 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
15e50 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
15e60 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
15e70 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
15e80 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
15e90 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
15ea0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
15eb0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
15ec0 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
15ed0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
15ee0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
15ef0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
15f00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15f10 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
15f20 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
15f30 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
15f40 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
15f50 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
15f60 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
15f70 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
15f80 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
15f90 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
15fa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
15fb0 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
15fc0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
15fd0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
15fe0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
15ff0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
16000 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
16010 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
16020 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
16030 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16040 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
16050 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
16060 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
16070 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
16080 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
16090 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
160a0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
160b0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
160c0 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
160d0 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
160e0 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
160f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
16100 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16110 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16120 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
16130 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
16140 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16150 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
16160 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
16170 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
16180 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16190 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
161a0 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
161b0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
161c0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
161d0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
161e0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
161f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16200 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
16210 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
16220 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
16230 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
16240 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
16250 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
16260 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
16270 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
16280 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
16290 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
162a0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
162b0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
162c0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
162d0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
162e0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
162f0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
16300 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
16310 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16320 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16330 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
16340 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
16350 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
16360 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
16370 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
16380 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
16390 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
163a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
163b0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
163c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
163d0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
163e0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
163f0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
16400 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
16410 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
16420 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16430 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16440 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
16450 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
16460 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
16470 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
16480 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
16490 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
164a0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
164b0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
164c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
164d0 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
164e0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
164f0 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
16500 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
16510 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
16520 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16530 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
16540 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
16550 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
16560 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
16570 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
16580 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
16590 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
165a0 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
165b0 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
165c0 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
165d0 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
165e0 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
165f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
16600 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
16610 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
16620 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
16630 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
16640 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
16650 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
16660 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
16670 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
16680 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
16690 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
166a0 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
166b0 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
166c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
166d0 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
166e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
166f0 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
16700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16710 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
16720 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
16730 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
16740 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
16750 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16760 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16770 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16780 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
16790 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
167a0 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
167b0 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
167c0 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
167d0 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
167e0 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
167f0 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
16800 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
16810 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
16820 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
16830 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
16840 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
16850 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
16860 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
16870 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
16880 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
16890 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
168a0 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
168b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
168c0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
168d0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
168e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
168f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
16900 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16910 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
16920 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16930 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
16940 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
16950 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
16960 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16970 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16980 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16990 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
169a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
169b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
169c0 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
169d0 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
169e0 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
169f0 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
16a00 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
16a10 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
16a20 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
16a30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
16a40 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
16a50 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16a60 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
16a70 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
16a80 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
16a90 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
16aa0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16ab0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16ac0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
16ad0 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
16ae0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16af0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16b00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16b10 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16b20 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
16b30 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
16b40 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
16b50 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
16b60 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
16b70 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
16b80 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
16b90 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
16ba0 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
16bb0 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
16bc0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
16bd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16be0 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
16bf0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16c00 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
16c10 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
16c20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
16c30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16c40 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
16c50 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
16c60 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
16c70 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16c80 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
16c90 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
16ca0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
16cb0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
16cc0 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
16cd0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
16ce0 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
16cf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16d00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16d10 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
16d20 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
16d30 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
16d40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
16d50 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
16d60 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
16d70 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
16d80 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
16d90 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
16da0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
16db0 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
16dc0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
16dd0 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
16de0 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
16df0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
16e00 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
16e10 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
16e20 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
16e30 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
16e40 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
16e50 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
16e60 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
16e70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e90 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
16ea0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16eb0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
16ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16ed0 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
16ee0 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
16ef0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16f00 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
16f10 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
16f20 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
16f30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
16f40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
16f50 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16f60 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
16f70 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
16f80 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
16f90 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
16fa0 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
16fb0 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
16fc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16fd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
16fe0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
16ff0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
17000 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
17010 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
17020 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
17030 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
17040 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
17050 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
17060 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
17070 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17080 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
17090 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
170a0 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
170b0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
170c0 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
170d0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
170e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
170f0 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
17100 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
17110 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
17120 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
17130 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
17140 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17150 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
17160 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
17170 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
17180 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17190 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
171a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
171b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
171c0 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
171d0 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
171e0 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
171f0 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
17200 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
17210 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
17220 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
17230 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
17240 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
17250 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
17260 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
17270 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
17280 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
17290 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
172a0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
172b0 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
172c0 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
172d0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
172e0 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
172f0 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
17300 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
17310 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
17320 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
17330 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17340 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
17350 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
17360 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
17370 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
17380 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17390 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
173a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
173b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
173c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
173d0 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
173e0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
173f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17410 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
17420 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
17430 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
17440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
17450 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
17460 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
17470 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17480 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
17490 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
174a0 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
174b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
174c0 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
174d0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
174e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
174f0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
17500 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
17510 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
17520 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17530 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17540 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
17550 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
17560 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
17570 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
17580 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
17590 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
175a0 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
175b0 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
175c0 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
175d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
175e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
175f0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
17600 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
17610 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
17620 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
17630 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
17640 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
17650 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
17660 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
17670 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
17680 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
17690 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
176a0 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
176b0 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
176c0 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
176d0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
176e0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
176f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17700 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
17710 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
17720 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
17730 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
17740 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
17750 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
17760 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
17770 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
17780 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
17790 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
177a0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
177b0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
177c0 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
177d0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
177e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
177f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
17800 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
17810 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
17820 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
17830 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17840 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17850 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
17860 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17870 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17880 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
17890 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
178a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
178b0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
178c0 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
178d0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
178e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
178f0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17910 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
17920 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
17930 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
17940 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
17950 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
17960 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
17970 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
17980 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
17990 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
179a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
179b0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
179c0 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
179d0 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
179e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
179f0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
17a00 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
17a10 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
17a20 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
17a30 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
17a40 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
17a50 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
17a60 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
17a70 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
17a80 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
17a90 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
17aa0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
17ab0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
17ac0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17ad0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
17ae0 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
17af0 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
17b00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
17b10 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
17b20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17b30 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
17b40 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
17b50 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
17b60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17b70 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
17b80 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17b90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
17ba0 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  sOpen==0 ){.    
17bb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17bc0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
17bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17be0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
17bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
17c00 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ADB;.    }.#endi
17c10 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
17c20 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
17c30 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
17c40 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
17c50 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
17c60 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
17c70 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
17c80 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
17c90 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
17ca0 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
17cb0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
17cc0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
17cd0 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
17ce0 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
17cf0 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
17d00 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
17d10 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
17d20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
17d30 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
17d40 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
17d50 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
17d60 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17d70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
17d90 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
17da0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
17db0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
17dc0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
17dd0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
17de0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
17df0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
17e00 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
17e10 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
17e20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
17e30 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
17e40 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
17e50 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
17e60 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
17e70 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
17e80 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17e90 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
17ea0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
17eb0 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
17ec0 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
17ed0 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
17ee0 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
17ef0 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
17f00 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
17f10 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
17f20 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
17f30 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
17f40 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
17f50 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
17f60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17f70 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
17f80 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
17f90 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
17fa0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17fb0 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
17fc0 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
17fd0 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
17fe0 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
17ff0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
18000 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18010 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
18020 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
18030 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
18040 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
18050 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
18060 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
18070 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
18080 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
18090 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
180a0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
180b0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
180c0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
180d0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
180e0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
180f0 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
18100 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18110 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
18120 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
18130 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
18140 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
18150 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
18160 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
18170 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
18180 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
18190 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
181a0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
181b0 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
181c0 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
181d0 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
181e0 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
181f0 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
18200 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
18210 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
18220 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
18230 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
18240 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
18250 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
18260 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
18270 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
18280 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
18290 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
182a0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
182b0 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
182c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
182d0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
182e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
182f0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
18300 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
18310 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
18320 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
18330 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
18340 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18350 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
18360 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
18370 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18390 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
183a0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
183b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
183c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
183d0 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
183e0 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
183f0 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
18400 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
18410 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18420 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18430 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18440 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18450 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
18460 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
18470 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
18480 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
18490 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
184a0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
184b0 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
184c0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
184d0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
184e0 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
184f0 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
18500 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
18510 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
18520 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
18530 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
18540 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18550 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
18560 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
18570 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
18580 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
18590 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
185a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
185b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
185c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
185d0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
185e0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
185f0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
18600 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
18610 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
18620 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
18630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
18640 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
18650 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
18660 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
18670 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
18680 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
18690 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
186a0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
186b0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
186c0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
186d0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
186e0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
186f0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
18700 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
18710 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
18720 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
18730 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
18740 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
18750 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
18760 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
18770 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
18780 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
18790 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
187a0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
187b0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
187c0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
187d0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
187e0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
187f0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
18800 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
18810 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
18820 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
18830 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
18840 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
18850 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
18860 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
18870 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
18880 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
18890 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
188a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
188b0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
188c0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
188d0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
188e0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
188f0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
18900 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
18910 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18920 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
18930 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
18940 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18950 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
18960 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
18970 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
18980 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
18990 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
189a0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
189b0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
189c0 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
189d0 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
189e0 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
189f0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
18a00 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
18a10 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
18a20 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
18a30 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
18a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
18a50 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18a60 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
18a70 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
18a80 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
18a90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18aa0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
18ab0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18ac0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
18ad0 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
18ae0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
18af0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
18b00 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
18b10 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
18b20 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
18b30 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
18b40 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
18b50 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
18b60 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
18b70 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
18b80 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
18b90 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
18ba0 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
18bb0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
18bc0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
18bd0 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
18be0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
18bf0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
18c00 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
18c10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
18c20 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
18c30 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
18c40 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
18c50 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
18c60 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
18c70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
18c80 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
18c90 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18ca0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
18cb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
18cc0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
18cd0 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
18ce0 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
18cf0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
18d00 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
18d10 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
18d20 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
18d30 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
18d40 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
18d50 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
18d60 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
18d70 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
18d80 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
18d90 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
18da0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
18db0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
18dc0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
18dd0 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
18de0 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
18df0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
18e00 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
18e10 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
18e20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
18e30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
18e40 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
18e50 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
18e60 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
18e70 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
18e80 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
18e90 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
18ea0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
18eb0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18ec0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
18ed0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
18ee0 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
18ef0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
18f00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18f10 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18f20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
18f30 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
18f40 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
18f50 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
18f60 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
18f70 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18f80 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
18f90 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
18fa0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
18fb0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
18fc0 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
18fd0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
18fe0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
18ff0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
19000 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
19010 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
19020 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
19030 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
19040 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  l(pPage1);.  }.}
19050 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
19060 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
19070 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
19080 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
19090 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
190a0 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
190b0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
190c0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
190d0 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
190e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
190f0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
19100 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19110 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
19120 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
19130 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
19140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19150 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
19160 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
19170 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
19180 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19190 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
191a0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
191b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
191c0 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
191d0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
191e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
191f0 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
19200 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19210 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
19220 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
19230 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
19240 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
19250 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
19260 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
19270 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
19280 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
19290 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
192a0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
192b0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
192c0 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
192d0 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
192e0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
192f0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
19300 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
19310 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
19320 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
19330 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
19340 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
19350 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
19360 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
19370 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
19380 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
19390 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
193a0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
193b0 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
193c0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
193d0 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
193e0 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
193f0 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
19400 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
19410 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
19420 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19430 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
19440 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
19450 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
19460 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
19470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
19480 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
19490 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
194a0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
194b0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
194c0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
194d0 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
194e0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
194f0 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
19500 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
19510 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
19520 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
19530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
19550 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
19560 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
19570 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
19580 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
19590 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
195a0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
195b0 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
195c0 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
195d0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
195e0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
195f0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19600 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
19610 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
19620 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
19630 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
19640 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19650 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
19660 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
19670 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
19680 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19690 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
196a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
196b0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
196c0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
196d0 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
196e0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
196f0 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
19700 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
19710 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
19720 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
19730 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
19740 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19750 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
19760 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
19770 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19780 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
19790 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
197a0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
197b0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
197c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
197d0 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
197e0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
197f0 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
19800 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
19810 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
19820 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
19830 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
19840 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
19850 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
19860 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
19870 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
19880 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
19890 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
198a0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
198b0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
198c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
198d0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
198e0 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
198f0 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
19900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19910 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
19920 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
19930 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
19940 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
19950 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
19960 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
19970 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
19980 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
19990 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
199a0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
199b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
199c0 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
199d0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
199e0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
199f0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
19a00 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
19a10 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
19a20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
19a30 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
19a40 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
19a50 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
19a60 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
19a70 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
19a80 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
19a90 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
19aa0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
19ab0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
19ac0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
19ad0 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
19ae0 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
19af0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
19b00 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
19b10 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
19b20 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
19b30 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
19b40 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
19b50 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
19b60 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
19b70 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
19b80 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
19b90 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
19ba0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
19bb0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
19bc0 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
19bd0 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
19be0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
19bf0 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
19c00 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
19c10 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
19c20 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
19c30 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
19c40 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
19c50 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
19c60 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
19c70 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
19c80 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
19c90 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
19ca0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
19cb0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
19cc0 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
19cd0 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
19ce0 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
19cf0 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
19d00 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
19d10 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
19d20 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
19d30 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
19d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19d50 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
19d60 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
19d70 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
19d80 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
19d90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19da0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
19db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
19dc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19dd0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
19de0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
19df0 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
19e00 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
19e10 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
19e20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
19e30 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
19e40 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
19e50 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
19e60 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
19e70 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
19e80 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
19e90 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
19ea0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
19eb0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
19ec0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
19ed0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
19ee0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
19ef0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
19f00 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
19f10 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
19f20 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
19f30 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
19f40 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
19f50 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
19f60 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
19f70 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
19f80 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
19f90 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
19fa0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
19fb0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
19fc0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
19fd0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
19fe0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
19ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a000 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1a010 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
1a020 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1a030 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
1a040 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
1a050 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
1a060 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1a070 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1a080 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1a090 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1a0a0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
1a0b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1a0c0 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
1a0d0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
1a0e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a0f0 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c  ANS_WRITE).   ||
1a100 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1a110 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1a120 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63  0.  ){.    pBloc
1a130 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
1a140 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->db;.  }else if
1a150 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
1a160 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1a170 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
1a180 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1a190 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1a1a0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1a1b0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1a1c0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c  p ){.        pBl
1a1d0 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
1a1e0 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
1a1f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1a210 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  pBlock ){.    sq
1a220 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
1a230 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
1a240 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
1a250 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
1a260 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67  AREDCACHE;.    g
1a270 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1a280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a290 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20  * Any read-only 
1a2a0 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72  or read-write tr
1a2b0 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65  ansaction implie
1a2c0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
1a2d0 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53   .  ** page 1. S
1a2e0 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  o if some other 
1a2f0 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69  shared-cache cli
1a300 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20  ent already has 
1a310 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20  a write-lock .  
1a320 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  ** on page 1, th
1a330 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e transaction ca
1a340 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20  nnot be opened. 
1a350 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
1a360 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1a370 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
1a380 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OT, READ_LOCK);.
1a390 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1a3a0 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73  =rc ) goto trans
1a3b0 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e  _begun;..  pBt->
1a3c0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1a3d0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1a3e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1a3f0 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73  ge==0 ) pBt->bts
1a400 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49  Flags |= BTS_INI
1a410 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1a420 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
1a430 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
1a440 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
1a450 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
1a460 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
1a470 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
1a480 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
1a490 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
1a4a0 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
1a4b0 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
1a4c0 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
1a4d0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
1a4e0 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
1a4f0 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
1a500 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
1a510 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
1a520 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
1a530 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
1a540 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
1a550 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
1a560 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
1a570 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
1a580 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
1a590 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
1a5a0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1a5b0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
1a5c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
1a5d0 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
1a5e0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
1a5f0 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
1a600 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
1a610 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1a620 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
1a630 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1a640 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1a650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1a660 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1a670 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1a680 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a690 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1a6a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
1a6b0 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
1a6c0 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
1a6d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1a6e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a6f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
1a700 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1a710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a720 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1a730 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a740 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1a750 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1a760 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1a770 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1a780 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1a790 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a7a0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1a7b0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1a7c0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1a7d0 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
1a7e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a7f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1a800 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1a810 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
1a820 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
1a830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a840 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1a850 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
1a860 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1a870 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
1a880 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
1a890 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
1a8a0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1a8b0 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
1a8c0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
1a8d0 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
1a8e0 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
1a8f0 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
1a900 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
1a910 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
1a920 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
1a930 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
1a940 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
1a950 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1a960 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
1a970 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
1a980 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a990 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
1a9a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
1a9b0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
1a9c0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1a9d0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
1a9e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a9f0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1aa00 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
1aa10 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
1aa20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
1aa30 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   p;.      pBt->b
1aa40 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1aa50 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
1aa60 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20   if( wrflag>1 ) 
1aa70 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1aa80 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a   BTS_EXCLUSIVE;.
1aa90 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
1aaa0 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
1aab0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
1aac0 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
1aad0 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
1aae0 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
1aaf0 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
1ab00 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
1ab10 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
1ab20 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
1ab30 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
1ab40 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
1ab50 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
1ab60 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
1ab70 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
1ab80 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
1ab90 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
1aba0 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
1abb0 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
1abc0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
1abd0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
1abe0 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
1abf0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1ac00 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
1ac10 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
1ac20 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
1ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ac40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ac50 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1ac60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1ac70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ac80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1ac90 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1aca0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1acb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
1acc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1acd0 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
1ace0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1acf0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1ad00 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1ad10 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1ad20 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1ad30 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1ad40 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
1ad50 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
1ad60 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
1ad70 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
1ad80 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
1ad90 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
1ada0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
1adb0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
1adc0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1add0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1ade0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1adf0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1ae00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
1ae10 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
1ae20 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1ae30 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
1ae40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ae50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ae60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ae70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ae80 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
1ae90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
1aea0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
1aeb0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
1aec0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
1aed0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
1aee0 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
1aef0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1af00 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
1af10 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
1af20 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
1af30 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
1af40 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1af50 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1af60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1af70 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af90 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1afa0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
1afb0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
1afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1afe0 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
1aff0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b020 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1b030 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b040 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
1b050 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
1b060 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
1b070 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1b080 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1b090 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b0a0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1b0b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1b0c0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
1b0d0 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1b0e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b0f0 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
1b100 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
1b110 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
1b120 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1b130 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1b140 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1b150 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1b160 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1b170 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1b180 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1b190 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1b1a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1b1b0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1b1c0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1b1d0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1b1e0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1b1f0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1b200 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1b210 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b220 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1b230 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1b240 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1b250 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b260 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1b270 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1b280 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1b290 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1b2a0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1b2b0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
1b2c0 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
1b2d0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1b2e0 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
1b2f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1b300 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1b310 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1b320 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1b330 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1b340 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1b350 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1b360 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1b370 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1b380 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1b390 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1b3a0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1b3b0 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1b3c0 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1b3d0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1b3e0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1b3f0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1b410 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1b420 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1b430 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1b440 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1b450 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1b460 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b480 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1b490 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1b4a0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1b4b0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1b4c0 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1b4d0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1b4e0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1b4f0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1b500 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b510 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1b520 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1b530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b540 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1b550 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1b560 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1b570 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1b580 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1b590 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b5a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1b5b0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1b5c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1b5d0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1b5e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1b5f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1b600 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1b610 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1b620 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1b630 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1b640 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1b650 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1b660 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1b670 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1b680 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1b690 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1b6a0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
1b6b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1b6c0 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
1b6d0 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
1b6e0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
1b6f0 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
1b700 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
1b710 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
1b720 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
1b730 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1b740 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b750 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
1b760 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1b770 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1b780 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1b790 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1b7a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1b7b0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1b7c0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1b7d0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
1b7e0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1b7f0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
1b800 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
1b810 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1b820 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
1b830 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
1b840 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
1b850 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
1b860 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1b870 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
1b880 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
1b890 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
1b8a0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
1b8b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1b8c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
1b8d0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
1b8e0 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
1b8f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b900 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1b910 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1b920 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1b930 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1b940 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1b950 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1b960 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b970 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b980 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1b990 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1b9a0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1b9b0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1b9c0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1b9d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1b9e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1b9f0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1ba00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ba10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ba20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1ba30 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1ba40 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1ba50 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1ba60 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1ba70 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1ba80 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1ba90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1baa0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1bab0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1bac0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1bad0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1bae0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1baf0 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1bb00 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1bb10 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1bb20 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1bb30 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1bb40 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1bb50 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1bb60 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1bb70 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1bb80 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1bb90 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1bba0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1bbb0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1bbc0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1bbd0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1bbe0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1bbf0 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1bc00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1bc10 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1bc20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1bc30 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1bc40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1bc50 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1bc60 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1bc70 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1bc80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bc90 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1bca0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1bcb0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1bcc0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1bcd0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1bce0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1bcf0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1bd00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1bd10 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1bd20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1bd30 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1bd40 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1bd50 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1bd60 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1bd70 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1bd80 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1bd90 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1bda0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1bdb0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1bdc0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1bdd0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1bde0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1bdf0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1be00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1be10 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1be20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1be30 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1be40 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1be50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1be60 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1be70 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1be80 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1be90 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1bea0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1beb0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1bec0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1bed0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1bee0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1bef0 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1bf00 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1bf10 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1bf20 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1bf30 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1bf40 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1bf50 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1bf60 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1bf70 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1bf80 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1bf90 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1bfa0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1bfb0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1bfc0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1bfd0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1bfe0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1bff0 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1c000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c010 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c020 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1c030 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1c040 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1c050 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1c060 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1c070 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1c080 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1c090 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1c0a0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c0b0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1c0c0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1c0d0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1c0e0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1c0f0 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1c100 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1c110 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1c120 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1c130 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1c140 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1c150 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1c160 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1c170 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1c180 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1c190 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1c1a0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1c1b0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1c1c0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1c1d0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1c1e0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1c1f0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1c200 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1c210 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1c220 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1c230 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1c240 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c250 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c260 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1c270 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1c280 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1c290 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1c2a0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1c2b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1c2c0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1c2d0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1c2e0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1c2f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1c300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c310 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1c320 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1c330 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1c340 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1c350 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1c360 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1c370 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1c380 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1c390 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1c3a0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1c3b0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1c3c0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1c3d0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1c3e0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1c3f0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1c400 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1c410 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1c420 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1c430 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c450 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c470 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1c480 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1c490 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c4a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c4b0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1c4c0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1c4d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c4e0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1c4f0 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1c500 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1c510 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1c520 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1c530 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1c540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c550 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1c560 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1c570 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1c580 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1c590 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c5a0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1c5b0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1c5c0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1c5d0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1c5e0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1c5f0 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1c600 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1c610 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1c620 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1c630 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1c640 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1c650 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1c660 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1c670 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1c680 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1c690 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1c6a0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1c6b0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1c6c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1c6d0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1c6e0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1c6f0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1c700 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1c710 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1c720 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1c730 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1c740 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1c750 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1c760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1c770 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1c780 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1c790 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1c7a0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1c7b0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1c7c0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1c7d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1c7e0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1c7f0 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1c800 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1c810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1c820 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1c830 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1c840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1c850 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1c860 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1c870 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1c880 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1c890 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1c8a0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1c8b0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1c8c0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1c8d0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1c8e0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1c8f0 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1c900 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1c910 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1c920 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1c930 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1c940 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1c950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1c960 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1c970 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1c980 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1c990 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1c9a0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1c9b0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1c9c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1c9d0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1c9e0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1c9f0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1ca00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ca10 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1ca20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1ca30 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1ca40 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1ca50 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1ca60 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1ca70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ca80 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1ca90 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1caa0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1cab0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1cac0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1cad0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1cae0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1caf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1cb00 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1cb10 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1cb20 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1cb30 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1cb40 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1cb50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cb60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cb70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1cb80 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1cb90 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1cba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cbb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1cbc0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1cbd0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1cbe0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1cbf0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1cc00 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1cc10 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1cc20 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1cc30 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1cc40 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1cc50 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1cc60 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1cc70 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1cc80 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1cc90 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1cca0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1ccb0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1ccc0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1ccd0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1cce0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1ccf0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1cd00 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1cd10 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1cd20 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1cd30 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1cd40 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1cd50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1cd60 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1cd70 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1cd80 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1cd90 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1cda0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1cdb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cdc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1cdd0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1cde0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1cdf0 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1ce00 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1ce10 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1ce20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1ce30 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1ce40 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1ce50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1ce60 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1ce70 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1ce80 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1ce90 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1cea0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1ceb0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1cec0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1ced0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1cee0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1cef0 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1cf00 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1cf10 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1cf20 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1cf30 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1cf40 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1cf50 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1cf60 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1cf70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cf80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1cf90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1cfa0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1cfb0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1cfc0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1cfd0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1cfe0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1cff0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1d000 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1d010 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1d020 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1d030 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d040 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1d050 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1d060 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1d070 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1d080 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1d090 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1d0a0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1d0b0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1d0c0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1d0d0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1d0e0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1d0f0 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1d100 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1d110 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1d120 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1d130 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1d140 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1d150 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1d160 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d170 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1d180 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1d190 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1d1a0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1d1b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d1c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d1d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d1e0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1d1f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d210 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d220 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1d230 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1d240 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1d250 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d260 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1d270 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1d280 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1d290 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1d2a0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1d2b0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1d2c0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1d2d0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1d2e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d300 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d320 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1d330 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1d340 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1d350 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1d360 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1d370 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1d380 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1d390 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1d3a0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1d3b0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1d3c0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1d3d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d3e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d3f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1d400 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1d410 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1d420 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1d430 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1d440 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1d450 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1d460 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1d470 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1d480 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1d490 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1d4a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1d4b0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1d4c0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1d4d0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1d4e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1d4f0 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1d500 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1d510 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1d520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d530 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1d540 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1d550 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1d560 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1d570 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d580 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1d590 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1d5a0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1d5d0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1d5e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1d5f0 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1d600 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1d610 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1d620 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1d630 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1d640 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1d650 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1d660 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1d670 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1d680 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1d690 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1d6a0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1d6b0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1d6c0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1d6d0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1d6e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d6f0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1d700 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1d710 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1d720 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1d730 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1d740 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1d750 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1d760 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1d770 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1d780 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1d790 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1d7a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1d7b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1d7c0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1d7d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1d7e0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1d7f0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1d800 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1d810 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1d820 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1d830 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1d840 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1d850 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1d860 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1d870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d880 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1d890 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1d8a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1d8b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1d8c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d8d0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1d8e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d8f0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1d900 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1d910 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1d920 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1d930 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1d940 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d950 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1d960 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1d970 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1d980 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1d990 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1d9a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d9b0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1d9c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1d9d0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1d9e0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1d9f0 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1da00 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1da10 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1da20 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1da30 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1da40 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1da50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1da60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1da70 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1da80 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1da90 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1daa0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1dab0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1dac0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1dad0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1dae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1daf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1db00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1db10 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1db20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1db30 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1db40 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1db50 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1db60 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1db70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1db80 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1db90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1dba0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1dbb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1dbc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1dbd0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1dbe0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1dbf0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1dc00 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1dc10 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1dc20 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1dc30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1dc40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dc50 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1dc60 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1dc70 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1dc80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dc90 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1dca0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1dcb0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1dcc0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1dcd0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1dce0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1dcf0 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1dd00 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1dd10 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1dd20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1dd30 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1dd40 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1dd50 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1dd60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1dd70 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1dd80 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1dd90 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1dda0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1ddb0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1ddc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ddd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1dde0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1ddf0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1de00 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1de10 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1de20 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1de30 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1de40 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1de50 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1de60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1de70 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1de80 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1de90 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1dea0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1deb0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1dec0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1ded0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1dee0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1def0 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1df00 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1df10 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1df20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1df30 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1df40 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1df50 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1df60 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1df70 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1df80 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1df90 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1dfa0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1dfb0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1dfc0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1dfd0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1dfe0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1dff0 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1e000 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1e010 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1e020 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1e030 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1e040 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1e050 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1e060 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1e070 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1e080 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e090 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e0a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1e0b0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1e0c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e0d0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1e0e0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1e0f0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1e100 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1e110 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1e120 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e130 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1e140 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1e150 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1e160 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1e170 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1e180 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1e190 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1e1a0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1e1b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1e1c0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1e1d0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1e1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e1f0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1e200 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1e210 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1e220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e230 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e240 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e250 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1e260 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e270 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1e280 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e290 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e2a0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1e2b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e2c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e2d0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1e2e0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1e2f0 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1e300 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1e310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e330 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e340 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1e350 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1e360 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1e370 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1e380 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1e390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1e3a0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1e3b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e3c0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1e3d0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1e3e0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1e3f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1e400 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1e410 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1e420 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1e430 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1e440 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1e450 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1e460 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1e470 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1e480 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1e490 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1e4a0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1e4b0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1e4c0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1e4d0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1e4e0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1e4f0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1e500 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1e510 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1e520 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1e530 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1e540 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1e550 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1e560 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1e570 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1e580 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1e590 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1e5a0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1e5b0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1e5c0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1e5d0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1e5e0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1e5f0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1e600 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1e610 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1e620 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1e630 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1e640 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1e650 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1e660 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e670 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1e680 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1e690 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1e6a0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1e6b0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1e6c0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1e6d0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1e6e0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1e6f0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1e700 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1e710 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1e720 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1e730 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1e740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1e750 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1e760 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1e770 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1e780 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1e790 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1e7a0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1e7b0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1e7c0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1e7d0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1e7e0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1e7f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1e800 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1e810 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1e820 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1e830 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1e840 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1e850 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1e860 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1e870 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1e880 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1e890 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1e8a0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1e8b0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1e8c0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1e8d0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1e8e0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1e8f0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1e900 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1e910 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1e920 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1e930 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1e940 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1e950 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1e960 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1e970 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1e980 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1e990 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e9a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1e9b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1e9c0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1e9d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1e9e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e9f0 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1ea00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ea10 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1ea20 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1ea30 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1ea40 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1ea50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ea60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ea70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ea80 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1ea90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1eaa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1eab0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1eac0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1ead0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1eae0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1eaf0 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1eb00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1eb10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1eb20 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1eb30 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1eb40 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1eb50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1eb60 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1eb70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1eb80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1eb90 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1eba0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1ebb0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1ebc0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1ebd0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1ebe0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1ebf0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1ec00 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1ec10 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1ec20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ec30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1ec40 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1ec50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1ec60 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1ec70 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1ec80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ec90 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1eca0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1ecb0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1ecc0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1ecd0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1ece0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1ecf0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1ed00 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1ed10 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1ed20 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1ed30 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1ed40 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1ed50 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1ed60 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1ed70 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1ed80 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1ed90 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1eda0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1edb0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1edc0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1edd0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1ede0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1edf0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1ee00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1ee10 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1ee20 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1ee30 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1ee40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1ee50 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1ee60 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1ee70 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1ee80 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1ee90 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1eea0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1eeb0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1eec0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1eed0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1eee0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1eef0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1ef00 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1ef10 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1ef20 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1ef30 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1ef40 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1ef50 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1ef60 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1ef70 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1ef80 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1ef90 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1efa0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1efb0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1efc0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1efd0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1efe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1eff0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1f000 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1f010 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1f020 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1f030 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1f040 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1f050 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1f060 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f070 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1f080 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1f090 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f0a0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1f0b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1f0c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f0d0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1f0e0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1f0f0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1f100 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1f110 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1f120 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1f130 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1f140 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1f150 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1f160 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1f170 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1f180 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1f190 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1f1a0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1f1b0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1f1c0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1f1d0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1f1e0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1f1f0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1f200 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1f210 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1f220 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1f230 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1f240 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1f250 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1f260 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1f270 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1f280 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1f290 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1f2a0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1f2b0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1f2c0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1f2d0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1f2e0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1f2f0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1f300 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1f310 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1f320 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1f330 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1f340 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1f350 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1f360 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1f370 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1f380 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1f390 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1f3a0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1f3b0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1f3c0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1f3d0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1f3e0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1f3f0 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1f400 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1f410 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1f420 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1f430 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1f440 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1f450 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1f460 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1f470 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1f480 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1f490 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1f4a0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1f4b0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1f4c0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1f4d0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1f4e0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1f4f0 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1f500 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1f510 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1f520 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1f530 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1f540 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1f550 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1f560 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1f570 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1f580 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1f590 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1f5a0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1f5b0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1f5c0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1f5d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f5e0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1f5f0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1f600 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1f610 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1f620 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1f630 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f640 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1f650 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1f660 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1f670 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1f680 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1f690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1f6a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1f6b0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1f6c0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1f6d0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1f6e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1f6f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1f700 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1f710 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1f720 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1f730 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1f740 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1f750 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1f760 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1f770 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1f780 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1f790 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1f7a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1f7b0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1f7c0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1f7d0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1f7e0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1f7f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f800 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1f810 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1f820 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f830 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1f840 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1f850 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f860 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1f870 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1f880 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
1f890 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
1f8a0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
1f8b0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
1f8c0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1f8d0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1f8e0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1f8f0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1f900 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1f910 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1f920 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1f930 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1f940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f950 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1f960 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1f970 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1f980 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1f990 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1f9a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1f9b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1f9c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1f9d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1f9e0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1f9f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fa00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1fa10 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1fa20 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1fa30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1fa40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1fa50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1fa60 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1fa70 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1fa80 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1fa90 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1faa0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1fab0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
1fac0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1fad0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1fae0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
1faf0 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
1fb00 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
1fb10 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
1fb20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
1fb30 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
1fb40 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
1fb50 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1fb60 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
1fb70 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
1fb80 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
1fb90 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
1fba0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1fbb0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1fbc0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
1fbd0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
1fbe0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1fbf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fc00 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1fc10 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1fc20 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
1fc30 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
1fc40 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
1fc50 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
1fc60 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
1fc70 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1fc80 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
1fc90 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
1fca0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
1fcb0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
1fcc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
1fcd0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
1fce0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
1fcf0 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
1fd00 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
1fd10 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
1fd20 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
1fd30 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
1fd40 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
1fd50 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
1fd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1fd70 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
1fd80 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
1fd90 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
1fda0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
1fdb0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1fdc0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
1fdd0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
1fde0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
1fdf0 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
1fe00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
1fe10 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
1fe20 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
1fe30 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1fe40 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
1fe50 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
1fe60 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
1fe70 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
1fe80 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
1fe90 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
1fea0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
1feb0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
1fec0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1fed0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
1fee0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
1fef0 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
1ff00 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
1ff10 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
1ff20 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1ff30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ff40 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1ff50 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1ff60 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
1ff70 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
1ff80 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1ff90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ffa0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
1ffb0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
1ffc0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
1ffd0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
1ffe0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
1fff0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
20000 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
20010 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
20020 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
20030 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
20040 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
20050 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
20060 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
20070 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
20080 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
20090 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
200a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
200b0 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
200c0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
200d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
200e0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
200f0 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
20100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20120 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
20130 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
20140 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
20150 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20160 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20170 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20190 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
201a0 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
201b0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
201c0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
201d0 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
201e0 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
201f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
20200 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
20210 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
20220 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
20230 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
20240 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
20250 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20260 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
20270 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
20280 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20290 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
202a0 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
202b0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
202c0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
202d0 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
202e0 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
202f0 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
20300 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
20310 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
20320 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
20330 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
20340 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
20350 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
20360 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20370 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
20380 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
20390 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
203a0 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
203b0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
203c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
203d0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
203e0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
203f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
20400 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
20410 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
20420 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
20430 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
20440 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20450 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
20460 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
20470 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
20480 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
20490 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
204a0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
204b0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
204c0 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
204d0 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
204e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
204f0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20500 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
20510 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
20520 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
20530 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20540 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
20550 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
20560 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
20570 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
20580 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
20590 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
205a0 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
205b0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
205c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
205d0 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
205e0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
205f0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20600 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
20610 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
20620 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
20630 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
20640 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
20650 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
20660 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
20670 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
20680 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
20690 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
206a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
206b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
206c0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
206d0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
206e0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
206f0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
20700 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
20710 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
20720 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20730 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
20740 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
20750 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
20760 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
20770 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
20780 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
20790 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
207a0 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
207b0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
207c0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
207d0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
207e0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
207f0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
20800 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
20810 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
20820 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
20830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
20840 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
20850 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
20860 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
20870 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
20880 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
20890 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
208a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
208b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
208c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
208d0 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
208e0 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
208f0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
20900 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
20910 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
20920 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20930 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
20940 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
20950 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
20960 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
20970 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
20980 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
20990 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
209a0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
209b0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
209c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
209d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
209e0 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
209f0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
20a00 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
20a10 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
20a20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
20a30 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
20a40 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
20a50 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
20a60 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
20a70 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
20a80 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
20a90 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
20aa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
20ab0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
20ac0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
20ad0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
20ae0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
20af0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
20b00 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
20b10 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
20b20 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
20b30 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
20b40 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
20b50 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
20b60 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
20b70 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
20b80 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
20b90 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
20ba0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
20bb0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
20bc0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
20bd0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
20be0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
20bf0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
20c00 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
20c10 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
20c20 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
20c30 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
20c40 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
20c50 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
20c60 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
20c70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
20c80 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
20c90 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
20ca0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
20cb0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
20cc0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
20cd0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
20ce0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
20cf0 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
20d00 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
20d10 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
20d20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
20d30 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
20d40 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
20d50 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
20d60 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
20d70 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
20d80 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
20d90 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
20da0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
20db0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
20dc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20dd0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
20de0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
20df0 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
20e00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20e10 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
20e20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
20e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
20e40 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
20e50 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
20e60 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
20e70 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
20e80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
20e90 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
20ea0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
20eb0 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
20ec0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
20ed0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
20ee0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
20ef0 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
20f00 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
20f10 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
20f20 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
20f30 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
20f40 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
20f50 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
20f60 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
20f70 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
20f80 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
20f90 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
20fa0 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
20fb0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
20fc0 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
20fd0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
20fe0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
20ff0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
21000 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
21010 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
21020 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
21030 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21040 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
21050 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21060 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21070 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
21080 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
21090 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
210a0 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
210b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
210c0 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
210d0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
210e0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
210f0 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
21100 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
21110 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
21120 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
21130 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
21140 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
21150 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
21160 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
21170 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
21180 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
21190 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
211a0 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
211b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
211c0 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
211d0 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
211e0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
211f0 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
21200 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
21210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
21220 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
21230 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
21240 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
21250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
21260 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
21270 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
21280 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
21290 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
212a0 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
212b0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
212c0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
212d0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
212e0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
212f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
21300 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
21310 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
21320 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
21330 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
21340 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
21350 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
21360 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
21370 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
21380 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
21390 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
213a0 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
213b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
213c0 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
213d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
213e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
213f0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
21400 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
21410 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
21420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
21440 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
21450 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21460 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
21470 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
21480 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
21490 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
214a0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
214b0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
214c0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
214d0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
214e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
214f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
21500 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
21510 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21520 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
21530 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
21540 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
21550 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
21560 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
21570 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
21580 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
21590 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
215a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
215b0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
215c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
215d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
215e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
215f0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
21600 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
21610 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
21620 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
21630 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
21640 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21650 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21660 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
21670 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
21680 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
21690 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
216a0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
216b0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
216c0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
216d0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
216e0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
216f0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
21700 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
21710 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
21720 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
21730 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
21740 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
21750 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
21760 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
21770 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
21780 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
21790 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
217a0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
217b0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
217c0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
217d0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
217e0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
217f0 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
21800 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
21810 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
21820 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
21830 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
21840 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
21850 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
21860 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
21870 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
21880 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
21890 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
218a0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
218b0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
218c0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
218d0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
218e0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
218f0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
21900 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
21910 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
21920 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
21930 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
21940 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
21950 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
21960 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
21970 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
21980 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
21990 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
219a0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
219b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
219c0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
219d0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
219e0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
219f0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
21a00 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
21a10 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
21a20 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
21a30 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
21a40 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
21a50 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
21a60 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
21a70 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
21a80 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
21a90 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
21aa0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
21ab0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
21ac0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
21ad0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
21ae0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
21af0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
21b00 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
21b10 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
21b20 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
21b30 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
21b40 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
21b50 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
21b60 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
21b70 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
21b80 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
21b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21bb0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
21bc0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
21bf0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
21c00 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
21c30 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
21c40 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
21c50 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
21c60 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
21c70 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
21c80 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
21c90 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
21ca0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
21cd0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
21ce0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21cf0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
21d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
21d10 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
21d20 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
21d30 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21d50 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
21d60 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
21d70 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
21d80 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
21d90 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
21da0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
21db0 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
21dc0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
21dd0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
21de0 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
21df0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
21e00 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
21e10 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
21e20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
21e30 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
21e40 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
21e50 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
21e60 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
21e70 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
21e80 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
21e90 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
21ea0 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
21eb0 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
21ec0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
21ed0 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
21ee0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
21ef0 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
21f00 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
21f10 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
21f20 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
21f30 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
21f40 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
21f50 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
21f60 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
21f70 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
21f80 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
21f90 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
21fa0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
21fb0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
21fc0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
21fd0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
21fe0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
21ff0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
22000 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
22010 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
22020 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
22030 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46  =0 );..  if( wrF
22040 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
22050 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
22060 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
22070 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
22080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22090 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  EM;.  }.  if( iT
220a0 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
220b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
220c0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
220d0 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
220e0 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
220f0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
22100 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
22110 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
22120 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
22130 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
22140 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
22150 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
22160 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
22170 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
22180 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
22190 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
221a0 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
221b0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
221c0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
221d0 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
221e0 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
221f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  t;.  assert( wrF
22200 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
22210 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ==BTCF_WriteFlag
22220 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   );.  pCur->curF
22230 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20  lags = wrFlag;. 
22240 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
22250 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20  lags = wrFlag ? 
22260 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 : PAGER_GET_RE
22270 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20  ADONLY;.  /* If 
22280 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
22290 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
222a0 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
222b0 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20   then all such. 
222c0 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73   ** cursors *mus
222d0 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46  t* have the BTCF
222e0 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
222f0 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d  et. */.  for(pX=
22300 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58  pBt->pCursor; pX
22310 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
22320 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e  .    if( pX->pgn
22330 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61  oRoot==(Pgno)iTa
22340 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d  ble ){.      pX-
22350 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
22360 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
22370 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
22380 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
22390 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  e;.    }.  }.  p
223a0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
223b0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74  ->pCursor;.  pBt
223c0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
223d0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
223e0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
223f0 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  D;.  return SQLI
22400 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
22410 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
22420 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22450 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
22460 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22490 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
224a0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
224b0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
224e0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
224f0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
22500 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
22510 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
22520 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22530 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
22540 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
22550 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22570 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
22580 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
22590 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
225a0 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20  f( iTable<1 ){. 
225b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
225c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
225d0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
225e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
225f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75      rc = btreeCu
22600 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
22610 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
22620 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  , pCur);.    sql
22630 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
22640 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
22660 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
22670 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
22680 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
22690 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
226a0 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
226b0 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
226c0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
226d0 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
226e0 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
226f0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
22700 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
22710 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
22720 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
22730 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
22740 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
22750 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
22760 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
22770 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
22780 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
22790 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
227a0 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
227b0 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
227c0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
227d0 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
227e0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
227f0 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
22800 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
22810 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
22820 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
22830 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
22840 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
22850 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
22860 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
22870 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
22880 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
22890 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
228a0 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
228b0 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
228c0 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
228d0 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
228e0 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
228f0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
22900 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
22910 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
22920 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
22930 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
22940 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
22950 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
22960 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
22970 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
22980 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
22990 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
229a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
229b0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
229c0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
229d0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
229e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
229f0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
22a00 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
22a10 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
22a20 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
22a30 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
22a40 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
22a50 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
22a60 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
22a70 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
22a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
22a90 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
22aa0 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ur);.    assert(
22ab0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
22ac0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
22ad0 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
22ae0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
22af0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
22b00 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
22b10 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
22b20 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
22b30 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
22b40 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
22b50 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
22b60 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
22b70 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
22b80 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
22b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22ba0 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
22bb0 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
22bc0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
22bd0 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
22be0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
22bf0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
22c00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
22c10 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
22c20 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
22c30 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
22c40 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
22c50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22c60 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
22c70 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
22c80 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
22c90 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22ca0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
22cb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
22cc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22cd0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
22ce0 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
22cf0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
22d00 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
22d10 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
22d20 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
22d30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
22d40 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
22d50 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
22d60 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
22d70 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
22d80 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
22d90 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
22da0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
22db0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
22dc0 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
22dd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
22de0 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
22df0 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64  Cell()..*/.#ifnd
22e00 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
22e10 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
22e20 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
22e30 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
22e40 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
22e50 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
22e60 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
22e70 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
22e80 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
22e90 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
22ea0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
22eb0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
22ec0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
22ed0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
22ee0 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
22ef0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
22f00 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
22f10 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
22f20 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
22f30 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
22f40 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
22f50 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
22f60 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
22f70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
22f80 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
22f90 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
22fa0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
22fb0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75  ->iPage;.    pCu
22fc0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
22fd0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
22fe0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
22ff0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
23000 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
23010 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
23020 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
23030 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
23040 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
23050 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
23060 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
23070 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
23080 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
23090 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
230a0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
230b0 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
230c0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
230d0 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
230e0 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
230f0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
23100 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
23110 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
23120 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
23130 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
23140 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
23150 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
23160 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
23170 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23180 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
23190 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
231a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
231b0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
231c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
231d0 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
231e0 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
231f0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
23200 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
23210 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
23220 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
23230 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
23240 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
23250 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
23260 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
23270 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
23280 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
23290 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
232a0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
232b0 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
232c0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
232d0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
232e0 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
232f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
23300 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
23310 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
23320 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
23330 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
23340 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
23350 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
23360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
23370 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
23380 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
23390 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
233a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
233b0 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
233c0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
233d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
233e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
233f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23400 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23410 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23420 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
23430 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70  r);.  *pSize = p
23440 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
23450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23460 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
23470 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
23480 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
23490 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
234a0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
234b0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
234c0 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
234d0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
234e0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
234f0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
23500 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
23510 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
23520 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
23530 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
23540 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
23550 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
23560 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
23570 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
23580 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
23590 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
235a0 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
235b0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
235c0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
235d0 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
235e0 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
235f0 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
23600 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
23610 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
23620 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
23630 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
23640 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
23650 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
23660 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
23670 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
23680 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
23690 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
236a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
236b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
236c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
236d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
236e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
236f0 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge>=0 );.  asser
23700 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
23710 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
23720 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
23730 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23740 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79  ->iPage]->intKey
23750 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74  Leaf==1 );.  get
23760 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23770 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
23780 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
23790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
237a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
237b0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
237c0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
237d0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
237e0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
237f0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
23800 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
23810 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
23820 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
23830 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
23840 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
23850 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
23860 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
23870 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
23880 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
23890 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
238a0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
238b0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
238c0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
238d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
238e0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
238f0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
23900 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
23910 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
23920 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
23930 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
23940 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
23950 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
23960 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
23970 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
23980 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
23990 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
239a0 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
239b0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
239c0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
239d0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
239e0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
239f0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
23a00 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
23a10 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
23a20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
23a30 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
23a40 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
23a50 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
23a60 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
23a70 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
23a80 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
23a90 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
23aa0 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
23ab0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
23ac0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
23ad0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
23ae0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
23af0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
23b00 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
23b10 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
23b20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
23b30 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
23b40 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
23b50 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
23b60 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
23b70 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
23b80 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
23b90 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
23ba0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
23bb0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23bd0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
23be0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
23bf0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
23c00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
23c10 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
23c20 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
23c30 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
23c40 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
23c50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
23c60 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
23c70 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
23c80 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
23c90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
23ca0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
23cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
23cc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23cd0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
23ce0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
23cf0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
23d00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23d10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
23d20 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
23d30 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
23d40 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
23d50 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
23d60 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
23d70 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
23d80 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
23d90 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
23da0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
23db0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
23dc0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
23dd0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
23de0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
23df0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
23e00 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
23e10 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
23e20 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
23e30 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
23e40 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
23e50 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
23e60 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
23e70 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
23e80 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
23e90 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
23ea0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
23eb0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
23ec0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
23ed0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
23ee0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
23ef0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
23f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23f10 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
23f20 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
23f30 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
23f40 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
23f50 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
23f60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
23f70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
23f80 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
23f90 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
23fa0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
23fb0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
23fc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23fd0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
23fe0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
23ff0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
24000 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
24010 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
24020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24030 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
24040 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
24050 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
24060 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
24070 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
24080 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
24090 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
240a0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
240b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
240c0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
240d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
240e0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
240f0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
24100 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
24110 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
24120 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
24130 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
24140 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
24150 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
24160 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
24170 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
24180 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
24190 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
241a0 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
241b0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
241c0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
241d0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
241e0 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
241f0 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
24200 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
24210 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
24220 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
24230 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
24240 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
24250 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
24260 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
24270 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
24280 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
24290 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
242a0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
242b0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
242c0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
242d0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
242e0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
242f0 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
24300 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
24310 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24320 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
24330 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
24340 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
24350 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
24360 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
24370 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
24380 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
24390 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
243a0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
243b0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
243c0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
243d0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
243e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
243f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
24400 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
24410 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24420 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
24430 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
24440 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
24450 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
24460 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
24470 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
24480 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
24490 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
244a0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
244b0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
244c0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
244d0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
244e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
244f0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
24500 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24530 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
24540 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
24550 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
24560 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
24570 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
24580 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
24590 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
245a0 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
245b0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
245c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
245d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
245e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
245f0 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
24600 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
24610 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
24620 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
24630 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
24640 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
24650 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
24660 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
24670 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
24680 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
24690 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
246a0 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
246b0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
246c0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
246d0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
246e0 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
246f0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
24700 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72  **   2: The oper
24710 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
24720 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65   Do not populate
24730 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
24740 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
24750 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
24760 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
24770 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
24780 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
24790 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
247a0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
247b0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
247c0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
247d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
247e0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
247f0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
24800 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
24810 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
24820 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
24830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
24840 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
24850 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
24860 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
24870 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65  ges and the.** e
24880 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  Op argument is n
24890 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74  ot 2, this funct
248a0 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
248b0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
248c0 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61  azily .** popula
248d0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
248e0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
248f0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
24900 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
24910 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
24920 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
24930 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
24940 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
24950 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
24960 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
24970 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
24980 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
24990 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
249a0 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
249b0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
249c0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
249d0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
249e0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
249f0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
24a00 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
24a10 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
24a20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
24a30 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
24a40 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
24a50 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
24a60 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
24a70 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
24a80 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
24a90 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
24aa0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
24ab0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
24ac0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
24ad0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
24ae0 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
24af0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
24b00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
24b10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
24b20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
24b30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
24b40 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
24b50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
24b60 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
24b70 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
24b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
24b90 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
24ba0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
24bb0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
24bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24bd0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
24be0 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
24bf0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
24c00 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
24c10 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
24c20 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
24c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
24c40 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
24c50 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
24c60 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
24c70 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
24c80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24c90 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
24ca0 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
24cb0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
24cc0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24cd0 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
24ce0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
24cf0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
24d00 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
24d10 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
24d20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
24d30 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
24d40 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
24d50 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
24d60 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
24d70 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
24d80 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
24d90 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b  Buf;.  int bEnd;
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
24dd0 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61  ing to end of da
24de0 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ta */.#endif..  
24df0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
24e00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24e10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24e20 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
24e30 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
24e40 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
24e50 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
24e60 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24e70 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24e80 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
24e90 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b   || offset==0 );
24ea0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74      /* Always st
24eb0 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69  art from beginni
24ec0 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f  ng for eOp==2 */
24ed0 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
24ee0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
24ef0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
24f00 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20  Payload;.#ifdef 
24f10 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
24f20 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45  ERFLOW_READ.  bE
24f30 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d  nd = offset+amt=
24f40 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  =pCur->info.nPay
24f50 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61  load;.#endif.  a
24f60 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
24f70 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
24f80 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69  nPayload );..  i
24f90 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  f( &aPayload[pCu
24fa0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
24fb0 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
24fc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
24fd0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
24fe0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
24ff0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
25000 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
25010 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
25020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
25030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
25040 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
25050 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
25060 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
25070 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
25080 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
25090 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
250a0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
250b0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
250c0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
250d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
250e0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
250f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
25100 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
25110 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
25120 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
25130 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
25140 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50  (eOp & 0x01), pP
25150 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
25160 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
25170 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
25180 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
25190 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
251a0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
251b0 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66  ocal;.  }...  if
251c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
251d0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
251e0 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
251f0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
25200 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
25210 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
25220 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
25230 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
25240 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
25250 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
25260 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
25270 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
25280 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
25290 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
252a0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
252b0 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
252c0 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
252d0 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
252e0 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
252f0 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
25300 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
25310 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
25320 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
25330 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
25340 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
25350 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
25360 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
25370 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
25380 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
25390 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
253a0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
253b0 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
253c0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
253d0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
253e0 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
253f0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
25400 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
25410 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
25420 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25430 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
25440 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
25450 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
25460 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
25470 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
25480 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
25490 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
254a0 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
254b0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
254c0 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
254d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
254e0 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
254f0 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
25500 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
25510 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f  r->aOverflow, nO
25520 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e  vfl*2*sizeof(Pgn
25530 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
25540 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
25550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
25560 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
25570 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25580 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
25590 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f  >nOvflAlloc = nO
255a0 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  vfl*2;.         
255b0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
255c0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
255d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
255e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
255f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
25600 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
25610 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
25620 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
25630 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
25640 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
25650 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a  idOvfl;.      }.
25660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
25670 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25680 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
25690 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
256a0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
256b0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
256c0 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
256d0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
256e0 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
256f0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
25700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25710 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
25720 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
25730 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75  )!=0.     && pCu
25740 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
25750 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20  set/ovflSize].  
25760 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20    ){.      iIdx 
25770 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
25780 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
25790 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
257a0 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
257b0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
257c0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
257d0 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
257e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
257f0 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
25800 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
25810 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
25820 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
25830 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
25840 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
25850 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
25860 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25870 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
25880 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25890 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
258a0 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
258b0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
258c0 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
258d0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
258e0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
258f0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
25900 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
25910 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
25920 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
25930 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
25940 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
25950 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
25960 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
25970 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
25980 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
25990 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
259a0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
259b0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
259c0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
259d0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
259e0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
259f0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
25a00 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
25a10 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
25a20 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
25a30 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
25a40 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
25a50 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
25a60 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
25a70 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
25a80 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
25a90 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
25aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
25ab0 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
25ac0 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
25ad0 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
25ae0 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
25af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25b00 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
25b10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25b20 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
25b30 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
25b40 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
25b50 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
25b60 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
25b70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
25b80 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
25b90 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
25ba0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
25bb0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
25bc0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
25bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25be0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
25bf0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
25c00 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
25c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25c20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
25c30 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
25c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
25c50 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
25c60 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
25c70 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
25c80 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
25c90 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
25ca0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
25cb0 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
25cc0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
25cd0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
25ce0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
25cf0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
25d00 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
25d10 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
25d20 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
25d30 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
25d40 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
25d50 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
25d60 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
25d70 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
25d80 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
25d90 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
25da0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
25db0 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
25dc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
25dd0 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
25de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
25df0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
25e00 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
25e10 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
25e20 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
25e30 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
25e40 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
25e50 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
25e60 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
25e70 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
25e80 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
25e90 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
25ea0 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
25eb0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
25ec0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
25ed0 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
25ee0 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
25ef0 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
25f00 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
25f10 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
25f20 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
25f30 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
25f40 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
25f50 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
25f60 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
25f70 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
25f80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
25f90 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
25fa0 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
25fb0 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
25fc0 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
25fd0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
25fe0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
25ff0 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
26000 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
26010 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
26020 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
26030 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
26040 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
26050 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
26060 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26070 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
26080 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
260b0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
260c0 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
260d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
26100 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
26110 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26140 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
26150 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
26160 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
26170 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
26180 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
26190 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
261a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
261b0 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
261c0 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
261d0 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
261e0 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
261f0 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
26200 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
26210 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
26220 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
26230 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
26240 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26260 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
26270 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26280 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
26290 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
262a0 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
262b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
262c0 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
262d0 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262f0 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
26300 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
26310 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
26320 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26330 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
26340 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
26350 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
26360 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
26370 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
26380 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26390 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
263a0 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
263b0 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
263c0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
263d0 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
263e0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
263f0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
26400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26410 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
26420 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
26430 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
26440 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
26450 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
26460 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26470 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
26480 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
264a0 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
264b0 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
264c0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
264d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
264e0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
264f0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
26500 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26510 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
26520 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
26530 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
26540 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
26550 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26560 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
26570 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26580 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
26590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
265a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
265b0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
265c0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
265d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
265e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
265f0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
26600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26610 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26620 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26630 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
26640 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
26650 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
26660 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
26670 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
26680 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
26690 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
266a0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
266b0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
266c0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
266d0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
266e0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
266f0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
26700 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
26710 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
26720 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26730 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
26740 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
26750 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
26760 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
26770 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
26780 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
26790 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
267a0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
267b0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
267c0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
267d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
267e0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
267f0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
26800 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26810 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26820 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
26830 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26840 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26850 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
26860 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
26870 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26880 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
26890 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
268a0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
268b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
268c0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
268d0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
268e0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
268f0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
26900 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
26910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
26920 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
26930 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26940 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
26950 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
26960 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
26970 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
26980 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
26990 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
269a0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
269b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
269c0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
269d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
269e0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
269f0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
26a00 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
26a10 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
26a20 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
26a30 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
26a40 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
26a50 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
26a60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
26a70 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
26a80 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
26a90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
26aa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26ab0 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
26ac0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26ad0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
26ae0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26af0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
26b00 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
26b10 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26b20 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
26b30 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
26b40 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
26b50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26b60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
26b70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26b80 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26b90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26ba0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
26bb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26bc0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
26bd0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
26be0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
26bf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26c00 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
26c10 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
26c20 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
26c30 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
26c40 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
26c50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26c60 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
26c70 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
26c80 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
26c90 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
26ca0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
26cb0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
26cc0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
26cd0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
26ce0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
26cf0 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
26d00 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
26d10 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
26d20 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
26d30 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
26d40 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
26d50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
26d60 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
26d70 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
26d80 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
26d90 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
26da0 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
26db0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
26dc0 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
26dd0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
26de0 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
26df0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
26e00 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
26e10 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
26e20 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
26e30 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
26e40 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
26e50 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
26e60 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
26e70 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
26e80 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
26e90 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
26ea0 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
26eb0 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
26ec0 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
26ed0 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
26ee0 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
26ef0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
26f00 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
26f10 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
26f20 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
26f30 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
26f40 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
26f50 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
26f60 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
26f70 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
26f80 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
26f90 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
26fa0 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
26fb0 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
26fc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
26fd0 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
26fe0 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
26ff0 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
27000 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
27010 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
27020 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
27030 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
27040 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27050 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
27060 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
27070 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
27080 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
27090 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
270a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
270b0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
270c0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
270d0 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
270e0 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
270f0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
27100 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27110 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
27120 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27130 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27150 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
27160 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
27170 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
27180 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27190 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
271a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
271b0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
271c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
271d0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
271e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
271f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
27200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27210 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27220 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d>pCur->apPage[p
27230 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27240 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
27250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27260 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27270 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d<pCur->apPage[p
27280 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27290 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f  taEnd ||CORRUPT_
272a0 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e  DB);.  amt = (in
272b0 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t)(pCur->apPage[
272c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
272d0 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
272e0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20  nfo.pPayload);. 
272f0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
27300 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74  nLocal<amt ) amt
27310 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
27320 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  ocal;.  *pAmt = 
27330 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
27340 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
27350 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
27360 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
27370 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
27380 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
27390 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
273a0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
273b0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
273c0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
273d0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
273e0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
273f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
27400 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
27410 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
27420 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
27430 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
27440 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
27450 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
27460 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
27470 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
27480 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
27490 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
274a0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
274b0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
274c0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
274d0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
274e0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
274f0 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
27500 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
27510 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
27520 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
27530 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
27540 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
27550 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
27560 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
27570 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
27580 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
27590 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
275a0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
275b0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
275c0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
275d0 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
275e0 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
275f0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
27600 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
27610 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
27620 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
27630 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
27640 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
27650 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
27660 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
27670 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
27680 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
27690 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
276a0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
276b0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
276c0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
276d0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
276e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
276f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
27700 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
27710 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
27720 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
27730 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
27740 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
27750 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
27760 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
27770 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
27780 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
27790 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
277a0 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
277b0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
277c0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
277d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
277e0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
277f0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
27800 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
27810 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
27820 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
27830 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27840 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27850 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27860 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27870 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27880 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
27890 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
278a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
278b0 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
278c0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
278d0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
278e0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
278f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27900 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72  BKPT;.  }.  pCur
27910 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
27920 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
27930 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
27940 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
27950 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
27960 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d  iPage++;.  pCur-
27970 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27980 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge] = 0;.  retur
27990 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
279a0 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
279b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
279c0 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20  r->iPage],.     
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279e0 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63     pCur, pCur->c
279f0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
27a00 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
27a10 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
27a20 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
27a30 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
27a40 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
27a50 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
27a60 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
27a70 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
27a80 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
27a90 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
27aa0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
27ab0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
27ac0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
27ad0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
27ae0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
27af0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
27b00 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
27b10 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
27b20 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
27b30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
27b40 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
27b50 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
27b60 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
27b70 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
27b80 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
27b90 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
27ba0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74   conditions test
27bb0 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e  ed below might n
27bc0 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20  ot be true.     
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27be0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63         ** in a c
27bf0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
27c00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  */.  assert( iId
27c10 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
27c20 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
27c30 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
27c40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
27c50 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
27c60 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
27c70 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
27c80 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
27c90 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
27ca0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
27cb0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
27cc0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
27cd0 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
27ce0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
27cf0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
27d00 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
27d10 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
27d20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
27d30 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
27d40 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
27d50 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
27d60 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
27d70 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
27d80 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
27d90 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
27da0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
27db0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
27dc0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
27dd0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
27de0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
27df0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
27e00 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
27e10 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
27e20 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
27e30 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
27e40 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27e50 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27e60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27e70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27e80 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
27e90 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
27ea0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27eb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27ec0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
27ed0 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
27ee0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27ef0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
27f00 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27f10 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
27f20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
27f30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
27f40 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
27f50 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
27f60 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
27f70 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
27f80 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
27f90 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
27fa0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
27fb0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
27fc0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
27fd0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
27fe0 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  vfl);.  releaseP
27ff0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
28000 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28010 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  age--]);.}../*.*
28020 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
28030 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
28040 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
28050 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
28060 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
28070 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
28080 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
28090 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
280a0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
280b0 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
280c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
280d0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
280e0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
280f0 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
28100 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28110 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
28120 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
28130 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
28140 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
28150 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
28160 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
28170 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
28180 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
28190 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
281a0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
281b0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
281c0 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
281d0 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
281e0 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
281f0 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
28200 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
28210 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
28220 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
28230 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
28240 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
28250 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
28260 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
28270 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
28280 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
28290 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
282a0 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
282b0 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
282c0 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
282d0 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
282e0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
282f0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
28300 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
28310 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
28320 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
28330 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
28340 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
28350 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
28360 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
28370 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
28380 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28390 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
283a0 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
283b0 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
283c0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
283d0 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
283e0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
283f0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
28400 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
28410 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
28420 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
28430 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
28440 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
28450 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
28460 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
28470 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
28480 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28490 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
284a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
284b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
284c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
284d0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
284e0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
284f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
28500 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28510 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
28520 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
28530 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
28540 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
28550 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
28560 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
28570 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
28580 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
28590 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
285a0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
285b0 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
285c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
285d0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
285e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
285f0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
28600 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
28610 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
28620 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
28630 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a   pCur->iPage ){.
28640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28650 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28660 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20  >iPage]!=0 );.  
28670 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
28680 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
28690 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
286a0 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -]);.    }.  }el
286b0 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
286c0 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
286d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
286e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
286f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28700 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
28710 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28720 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
28730 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
28740 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
28750 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
28760 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
28770 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
287a0 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
287b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
287c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
287d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
287e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
287f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28800 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
28810 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
28820 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
28830 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
28840 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
28850 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
28860 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
28870 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
28880 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
28890 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
288a0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
288b0 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
288c0 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
288d0 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
288e0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
288f0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
28900 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
28910 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
28920 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
28930 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
28940 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
28950 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
28960 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
28970 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
28980 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
28990 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
289a0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
289b0 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
289c0 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
289d0 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
289e0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
289f0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
28a00 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
28a10 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
28a20 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
28a30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
28a40 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
28a50 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
28a60 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
28a70 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
28a80 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
28a90 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
28aa0 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
28ab0 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
28ac0 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
28ad0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28ae0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
28af0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
28b00 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
28b10 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
28b20 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
28b30 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
28b40 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
28b50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28b60 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
28b70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
28b80 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
28b90 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28ba0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28bb0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
28bc0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
28bd0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
28be0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
28bf0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
28c00 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28c10 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
28c20 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
28c30 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
28c40 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
28c50 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
28c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28c70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
28c80 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
28c90 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
28ca0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
28cb0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
28cc0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
28cd0 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
28ce0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
28cf0 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
28d00 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
28d10 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
28d20 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
28d30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28d40 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
28d50 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
28d60 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
28d70 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
28d80 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
28d90 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
28da0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
28db0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
28dc0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
28dd0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
28de0 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
28df0 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
28e00 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
28e10 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
28e20 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
28e30 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
28e40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28e50 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
28e60 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
28e70 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28e80 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28e90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28ea0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28eb0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
28ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28ed0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
28ee0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28ef0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
28f00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28f10 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28f20 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
28f30 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
28f40 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
28f50 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
28f60 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28f70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
28f80 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
28f90 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
28fa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28fb0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28fc0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
28fd0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
28fe0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
28ff0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
29000 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29010 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
29020 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
29030 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
29040 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
29050 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29060 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
29070 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29080 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
29090 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
290a0 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
290b0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
290c0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
290d0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
290e0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
290f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
29100 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
29110 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
29120 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
29130 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
29140 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
29150 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29160 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29170 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29180 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29190 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
291a0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
291b0 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
291c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
291d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
291e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
291f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29200 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
29210 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29220 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29230 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29240 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
29250 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
29260 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29270 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
29280 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29290 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
292a0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
292b0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
292c0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
292d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
292e0 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
292f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
29300 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
29310 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29320 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
29330 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
29340 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
29350 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
29360 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29370 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
29380 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29390 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
293a0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
293b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
293c0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
293d0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
293e0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
293f0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
29400 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
29410 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
29420 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
29430 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
29440 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
29450 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29460 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29470 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
29480 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
29490 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
294a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
294b0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
294c0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
294d0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
294e0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
294f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29500 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
29510 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
29520 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
29530 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
29540 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
29550 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29560 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
29570 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
29580 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
29590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
295a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
295b0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
295c0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
295d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
295e0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
295f0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
29600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29610 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29620 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
29630 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
29640 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
29650 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
29660 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
29670 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
29680 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
29690 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
296a0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
296b0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
296c0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
296d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
296e0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
296f0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
29700 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
29710 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29720 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29730 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29740 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
29750 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
29760 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
29770 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
29780 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
29790 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
297a0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
297b0 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
297c0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
297d0 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
297e0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
297f0 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
29800 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29810 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
29820 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
29830 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
29840 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
29850 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
29860 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
29870 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
29880 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
29890 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
298a0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
298b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
298c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
298d0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
298e0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
298f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
29900 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29910 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
29920 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29930 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
29940 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29950 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29960 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
29970 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
29980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
29990 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
299a0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
299b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
299c0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
299d0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
299e0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
299f0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
29a00 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
29a10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29a20 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
29a30 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29a40 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
29a50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29a60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29a70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
29a80 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
29a90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
29aa0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
29ab0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29ad0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
29ae0 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
29af0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29b00 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
29b10 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
29b20 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
29b30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29b40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
29b50 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
29b60 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
29b70 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
29b80 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
29b90 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
29ba0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
29bb0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
29bc0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
29bd0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
29be0 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
29bf0 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
29c00 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
29c10 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
29c20 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
29c30 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
29c40 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
29c50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
29c60 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
29c70 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
29c80 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
29c90 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
29ca0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
29cb0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
29cc0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
29cd0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
29ce0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
29cf0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
29d00 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
29d10 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
29d20 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
29d30 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
29d40 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
29d50 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
29d60 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
29d70 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
29d80 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
29d90 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
29da0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
29db0 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
29dc0 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
29dd0 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
29de0 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
29df0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
29e00 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
29e10 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
29e20 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
29e30 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
29e60 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
29e70 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
29e80 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
29ea0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
29eb0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
29ec0 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
29ed0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
29ee0 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
29ef0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
29f00 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
29f10 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
29f20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
29f30 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
29f40 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
29f50 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
29f60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
29f70 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
29f80 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
29fb0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
29fc0 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
29fd0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
29fe0 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
29ff0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
2a000 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
2a010 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
2a020 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
2a030 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
2a040 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
2a050 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
2a060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a070 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
2a080 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
2a090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2a0a0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
2a0b0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
2a0c0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
2a0d0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
2a0e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
2a0f0 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
2a100 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2a110 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
2a120 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2a130 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2a140 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2a150 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a160 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a170 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2a180 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2a190 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
2a1a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
2a1b0 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2a1c0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
2a1d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2a1e0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2a1f0 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
2a200 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
2a210 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
2a220 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
2a230 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
2a240 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
2a250 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
2a260 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a270 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2a280 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2a290 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26  idNKey)!=0.   &&
2a2a0 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2a2b0 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
2a2c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2a2d0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2a2e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a2f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a300 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2a310 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a320 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2a330 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  =0 && pCur->info
2a340 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
2a350 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2a360 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2a370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2a380 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b    }..  if( pIdxK
2a390 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72  ey ){.    xRecor
2a3a0 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  dCompare = sqlit
2a3b0 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
2a3c0 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  e(pIdxKey);.    
2a3d0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2a3e0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2a3f0 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  ( pIdxKey->defau
2a400 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20  lt_rc==1 .      
2a410 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2a420 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20  efault_rc==0 .  
2a430 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2a440 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d  y->default_rc==-
2a450 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  1.    );.  }else
2a460 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2a470 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c  pare = 0; /* All
2a480 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65   keys are intege
2a490 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20  rs */.  }..  rc 
2a4a0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a4b0 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
2a4c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a4d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
2a4e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2a4f0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2a500 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
2a510 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2a520 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2a530 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a540 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
2a550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a560 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a570 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
2a580 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a590 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
2a5a0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2a5b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2a5c0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
2a5d0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
2a5e0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2a5f0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2a600 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a610 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2a620 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a630 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
2a640 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2a650 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43  e[0]->intKey==pC
2a660 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b  ur->curIntKey );
2a670 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a680 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49  >curIntKey || pI
2a690 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
2a6a0 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
2a6b0 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20   upr, idx, c;.  
2a6c0 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
2a6d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2a6e0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2a6f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2a700 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2a730 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
2a740 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
2a750 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
2a760 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
2a770 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
2a780 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
2a790 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
2a7a0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
2a7b0 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
2a7c0 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
2a7d0 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
2a7e0 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
2a7f0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2a800 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
2a810 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
2a820 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
2a830 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
2a840 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
2a850 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
2a860 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
2a870 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
2a880 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
2a890 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
2a8a0 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
2a8b0 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
2a8c0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
2a8d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
2a8e0 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
2a8f0 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
2a900 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2a910 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
2a920 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a930 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
2a940 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
2a950 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
2a960 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
2a970 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
2a980 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
2a990 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
2a9a0 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
2a9b0 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
2a9c0 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
2a9d0 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
2a9e0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
2a9f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2aa00 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2aa10 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
2aa20 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
2aa30 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2aa40 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
2aa50 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
2aa60 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2aa70 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2aa80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2aa90 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
2aaa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2aab0 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70  ile( 0x80 <= *(p
2aac0 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20  Cell++) ){.     
2aad0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2aae0 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  >=pPage->aDataEn
2aaf0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
2ab00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ab10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ab20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
2ab30 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
2ab40 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
2ab50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2ab60 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
2ab70 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2ab80 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  idx+1;.         
2ab90 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2aba0 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d  c = -1; break; }
2abb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2abc0 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  f( nCellKey>intK
2abd0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2abe0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2abf0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2ac00 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72  pr ){ c = +1; br
2ac10 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2ac20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ac30 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
2ac40 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ==intKey );.    
2ac50 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2ac60 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2ac70 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
2ac80 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
2ac90 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
2aca0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2acb0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2acc0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2acd0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2ace0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2acf0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2ad00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2ad10 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2ad20 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2ad30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ad40 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2ad50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2ad60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ad70 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2ad80 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2ad90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ada0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2adb0 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2adc0 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2add0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2ade0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
2adf0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2ae00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
2ae10 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
2ae20 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a  t nCell;  /* Siz
2ae30 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63  e of the pCell c
2ae40 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ell in bytes */.
2ae50 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2ae60 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2ae70 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20  pPage, idx);..  
2ae80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
2ae90 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
2aea0 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
2aeb0 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
2aec0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
2aed0 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
2aee0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
2aef0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
2af00 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
2af10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2af20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
2af30 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
2af40 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
2af50 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
2af60 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
2af70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
2af80 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
2af90 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
2afa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2afb0 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
2afc0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
2afd0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
2afe0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
2aff0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
2b000 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
2b010 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
2b020 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
2b030 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
2b040 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
2b050 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
2b060 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
2b070 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
2b080 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
2b090 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
2b0a0 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
2b0b0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2b0c0 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
2b0d0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
2b0e0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
2b0f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
2b100 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
2b110 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
2b120 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2b130 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
2b140 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
2b150 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2b160 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2b170 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
2b180 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2b190 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2b1a0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2b1b0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
2b1c0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2b1d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
2b1e0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
2b1f0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
2b200 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
2b210 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
2b220 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
2b230 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
2b240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2b250 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
2b260 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
2b270 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2b280 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
2b290 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
2b2a0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
2b2b0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2b2c0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2b2d0 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2b2e0 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
2b2f0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2b300 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2b310 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2b320 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
2b330 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2b340 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b350 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
2b360 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
2b370 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
2b380 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
2b390 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
2b3a0 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
2b3b0 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
2b3c0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
2b3d0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2b3e0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
2b3f0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
2b400 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
2b410 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
2b420 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
2b430 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
2b440 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
2b450 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20  an be called. . 
2b460 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2b470 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2b480 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2b490 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f  t, the xRecordCo
2b4a0 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61  mpare routine ma
2b4b0 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20  y read.         
2b4c0 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61   ** up to two va
2b4d0 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65  rints past the e
2b4e0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2b4f0 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20  . An extra 18 . 
2b500 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65           ** byte
2b510 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  s of padding is 
2b520 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65  allocated at the
2b530 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2b540 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  er in.          
2b550 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70  ** case this hap
2b560 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  pens.  */.      
2b570 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
2b580 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
2b590 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
2b5a0 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
2b5b0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
2b5c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2b5d0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
2b5e0 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
2b5f0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
2b600 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
2b610 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
2b620 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
2b630 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c  testcase( nCell<
2b640 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  0 );   /* True i
2b650 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e  f key size is 2^
2b660 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20  32 or more */.  
2b670 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b680 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f  ( nCell==0 );  /
2b690 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2b6a0 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2b6b0 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x00 */.         
2b6c0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2b6d0 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==1 );  /* Inval
2b6e0 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2b6f0 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a  80 0x80 0x01 */.
2b700 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b710 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20  se( nCell==2 ); 
2b720 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61   /* Minimum lega
2b730 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65  l index key size
2b740 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2b750 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20  ( nCell<2 ){.   
2b760 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2b770 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b780 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2b790 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2b7a0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2b7b0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
2b7c0 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
2b7d0 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20  c( nCell+18 );. 
2b7e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2b7f0 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
2b800 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2b810 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2b820 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b830 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2b840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b850 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b860 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2b870 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2b880 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
2b890 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
2b8a0 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
2b8b0 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b  r*)pCellKey, 2);
2b8c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b8d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2b8e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2b8f0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2b900 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2b910 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2b920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2b930 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2b940 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2b950 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2b960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2b970 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2b980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b990 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2b9a0 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2b9b0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2b9c0 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2b9d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2b9e0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2b9f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2ba00 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2ba10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2ba20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2ba30 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2ba40 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2ba50 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2ba60 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2ba70 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2ba80 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2ba90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2baa0 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2bab0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2bac0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2bad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2bae0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2baf0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2bb00 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2bb10 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2bb20 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2bb30 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2bb40 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2bb50 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2bb60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bb70 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
2bb80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2bb90 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2bba0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2bbb0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2bbc0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2bbd0 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
2bbe0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
2bbf0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
2bc00 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
2bc10 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2bc20 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2bc30 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2bc40 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2bc50 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
2bc60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2bc70 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
2bc80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2bc90 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2bca0 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2bcb0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2bcc0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2bcd0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
2bce0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2bcf0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
2bd00 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2bd10 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
2bd20 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
2bd30 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
2bd40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
2bd50 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
2bd60 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2bd70 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2bd80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bd90 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2bda0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2bdb0 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
2bdc0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
2bdd0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2bde0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
2bdf0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2be00 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
2be10 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2be20 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
2be30 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
2be40 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2be50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2be60 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2be70 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2be80 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2be90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2bea0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2beb0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2bec0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2bed0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2bee0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2bef0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2bf00 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2bf10 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2bf20 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2bf30 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2bf40 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2bf50 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2bf60 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2bf70 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2bf80 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2bf90 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2bfa0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2bfb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2bfc0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2bfd0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2bfe0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2bff0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2c000 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2c010 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2c020 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2c030 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2c040 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2c050 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2c060 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2c070 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2c080 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2c090 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2c0a0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2c0b0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2c0c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
2c0d0 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
2c0e0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
2c0f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c100 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
2c110 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
2c120 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
2c130 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
2c140 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
2c150 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2c160 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2c170 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2c180 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2c190 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2c1a0 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2c1b0 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2c1c0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
2c1d0 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
2c1e0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2c1f0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2c200 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2c210 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
2c220 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2c230 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2c240 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
2c250 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2c260 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2c270 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
2c280 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
2c290 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2c2a0 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2c2b0 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2c2c0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
2c2d0 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
2c2e0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2c2f0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2c300 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2c310 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2c320 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2c330 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2c340 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2c350 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2c360 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2c370 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2c380 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2c390 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2c3a0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2c3b0 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2c3c0 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2c3d0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2c3e0 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2c3f0 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2c400 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2c410 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2c420 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2c430 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2c440 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2c450 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2c460 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2c470 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2c480 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2c490 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2c4a0 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2c4b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2c4c0 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2c4d0 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2c4e0 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2c4f0 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2c500 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2c510 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2c520 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2c530 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2c540 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2c550 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2c560 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2c570 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2c580 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2c590 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2c5a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2c5b0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2c5c0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2c5d0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2c5e0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2c5f0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2c600 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2c610 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2c620 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2c630 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2c640 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2c650 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2c660 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2c670 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2c680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c690 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2c6a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2c6b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2c6c0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2c6d0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2c6e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c6f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2c700 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2c710 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2c720 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c730 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c740 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2c750 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2c760 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2c770 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2c780 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2c790 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2c7a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2c7b0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2c7c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c7d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c7e0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2c7f0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2c800 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2c810 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2c820 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2c830 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2c840 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2c850 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2c860 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2c870 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2c880 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2c890 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2c8a0 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2c8b0 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2c8c0 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2c8d0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2c8e0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2c8f0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2c900 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2c910 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2c920 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2c930 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2c940 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2c950 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2c960 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2c970 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2c980 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2c990 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2c9a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2c9b0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2c9c0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2c9d0 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2c9e0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2c9f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2ca00 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2ca10 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2ca20 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2ca30 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2ca40 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ca50 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2ca60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ca70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ca80 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2ca90 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2caa0 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2cab0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2cac0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2cad0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2cae0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2caf0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2cb00 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2cb10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cb20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2cb30 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2cb40 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2cb50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2cb60 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2cb70 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2cb80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
2cb90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2cba0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2cbb0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2cbc0 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2cbd0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2cbe0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2cbf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cc00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2cc10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2cc20 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2cc30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2cc40 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2cc50 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2cc60 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2cc70 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2cc80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2cc90 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65  int *pRes){.  Me
2cca0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2ccb0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2ccc0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2ccd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2cce0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2ccf0 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2cd00 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2cd10 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2cd20 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2cd30 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2cd40 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ID );.  pCur->in
2cd50 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2cd60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2cd70 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2cd80 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2cd90 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b  l);.  *pRes = 0;
2cda0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2cdb0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2cdc0 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
2cdd0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2cde0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2cdf0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ce00 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
2ce10 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ce20 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65  ->iPage])>=pPage
2ce30 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2ce40 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2ce50 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72  >iPage]--;.    r
2ce60 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2ce70 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
2ce80 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2ce90 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2cea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2ceb0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2cec0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2ced0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
2cee0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
2cef0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
2cf00 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
2cf10 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2cf20 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2cf30 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2cf40 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2cf50 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2cf60 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2cf70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2cf80 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2cf90 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
2cfa0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
2cfb0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
2cfc0 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
2cfd0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2cfe0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2cff0 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20  reePrevious().  
2d000 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2d010 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2d020 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2d030 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65   of merely decre
2d040 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2d050 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2d060 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2d070 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20  e previous cell 
2d080 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2d090 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2d0a0 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  r) btreePrevious
2d0b0 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75  ().** helper rou
2d0c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2d0d0 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2d0e0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2d0f0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a   different page.
2d100 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65  ** or to restore
2d110 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2d120 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2d130 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2d140 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2d150 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2d160 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2d170 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2d180 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2d190 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2d1a0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2d1b0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2d1c0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2d1d0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2d1e0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2d1f0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2d200 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2d210 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2d220 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2d230 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2d240 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2d250 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2d260 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2d270 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2d280 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2d290 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2d2a0 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2d2b0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2d2c0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2d2d0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2d2e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d2f0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2d300 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2d310 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2d320 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2d330 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2d340 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2d350 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2d360 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2d370 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2d380 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2d390 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2d3a0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2d3b0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2d3c0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2d3d0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2d3e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2d3f0 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res==0 );.  asse
2d400 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2d410 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2d420 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d430 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2d440 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d450 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
2d460 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2d470 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
2d480 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d490 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d4a0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2d4b0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d4c0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
2d4d0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2d4e0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2d4f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d520 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2d530 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2d540 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
2d550 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2d560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d580 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2d590 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2d5a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d5b0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2d5c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d5d0 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2d5e0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2d5f0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2d600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2d610 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
2d620 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2d630 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2d640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d650 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2d660 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2d670 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2d680 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2d690 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d6a0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
2d6b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2d6c0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
2d6d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
2d6e0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2d6f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2d700 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2d710 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
2d720 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2d730 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
2d740 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d750 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
2d760 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2d770 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
2d780 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
2d790 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d7a0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
2d7b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2d7c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2d7d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2d7e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2d7f0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2d800 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d810 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2d820 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2d830 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
2d840 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2d850 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2d860 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2d870 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d880 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79   (BTCF_ValidNKey
2d890 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2d8a0 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75  )==0 );..    pCu
2d8b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d8c0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
2d8d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2d8e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2d8f0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2d900 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2d910 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2d920 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d930 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2d940 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2d950 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2d960 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2d970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d980 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d990 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2d9a0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2d9b0 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  es){.  assert( c
2d9c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2d9d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d9e0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2d9f0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2da00 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2da10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2da20 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2da30 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2da40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
2da50 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
2da60 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2da70 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2da80 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2da90 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2daa0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2dab0 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2dac0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2dad0 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
2dae0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2daf0 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  ge]==0.   || pCu
2db00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2db10 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2db20 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2db30 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2db40 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2db50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2db60 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72  r->iPage]--;.  r
2db70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2db80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2db90 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
2dba0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2dbb0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
2dbc0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
2dbd0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
2dbe0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
2dbf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2dc00 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
2dc10 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
2dc20 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
2dc30 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
2dc40 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
2dc50 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
2dc60 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2dc70 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
2dc80 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
2dc90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2dca0 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
2dcb0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2dcc0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
2dcd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2dce0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
2dcf0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
2dd00 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
2dd10 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
2dd20 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
2dd30 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
2dd40 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2dd50 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2dd60 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2dd70 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2dd80 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2dd90 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2dda0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2ddb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2ddc0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2ddd0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2dde0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2ddf0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2de00 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2de10 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2de20 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2de30 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2de40 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2de50 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2de60 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2de70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2de80 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2de90 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2dea0 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2deb0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2dec0 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2ded0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2dee0 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2def0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2df00 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2df10 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2df20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2df30 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2df40 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2df50 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2df60 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2df70 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2df80 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2df90 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2dfa0 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2dfb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2dfc0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2dfd0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2dfe0 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2dff0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2e000 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2e010 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2e020 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2e030 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2e040 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2e050 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2e060 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2e070 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2e080 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2e090 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2e0a0 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2e0b0 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2e0c0 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2e0d0 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2e0e0 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2e0f0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2e100 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2e110 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2e120 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2e130 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e140 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2e150 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2e160 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2e170 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2e180 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2e190 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2e1a0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2e1b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2e1c0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2e1d0 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2e1e0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2e1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e200 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2e210 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e220 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2e230 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2e240 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2e250 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2e260 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2e270 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2e280 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2e290 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2e2a0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2e2b0 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2e2c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2e2d0 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2e2e0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2e2f0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2e300 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2e310 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2e320 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2e330 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2e340 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2e350 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2e360 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2e370 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2e380 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2e390 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2e3a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e3b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2e3c0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2e3d0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2e3e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2e3f0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2e400 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2e410 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2e420 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2e430 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2e440 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2e450 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2e460 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
2e470 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
2e480 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
2e490 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
2e4a0 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
2e4b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2e4c0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2e4d0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2e4e0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2e4f0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2e500 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2e510 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2e520 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2e530 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2e540 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2e550 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2e560 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2e570 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2e580 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2e590 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2e5a0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2e5b0 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2e5c0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2e5d0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2e5e0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2e5f0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2e600 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e610 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2e620 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2e630 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2e640 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2e650 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2e660 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2e670 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2e680 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2e690 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2e6a0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2e6b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e6c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2e6d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2e6e0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2e6f0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2e700 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2e710 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2e720 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2e730 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2e740 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2e750 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2e760 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2e770 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2e780 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2e790 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2e7a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e7b0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2e7c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2e7d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e7e0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2e7f0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2e800 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2e810 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2e820 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2e830 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2e840 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2e850 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2e860 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2e870 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2e880 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2e890 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2e8a0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2e8b0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2e8c0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2e8d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2e8e0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2e8f0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2e900 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2e910 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2e920 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2e930 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2e940 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2e950 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2e960 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2e970 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2e980 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
2e990 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
2e9a0 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2e9b0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2e9c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
2e9d0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2e9e0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
2e9f0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2ea00 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
2ea10 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
2ea20 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
2ea30 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
2ea40 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
2ea50 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2ea60 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2ea70 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2ea80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ea90 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2eaa0 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
2eab0 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2eac0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2ead0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
2eae0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
2eaf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2eb00 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2eb10 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
2eb20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
2eb30 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
2eb40 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
2eb50 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2eb60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2eb70 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2eb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2eb90 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2eba0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2ebb0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2ebc0 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
2ebd0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
2ebe0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2ebf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2ec00 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2ec10 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2ec20 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2ec30 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2ec40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ec50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2ec60 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2ec70 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2ec80 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2ec90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2eca0 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2ecb0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2ecc0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2ecd0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2ece0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2ecf0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2ed00 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2ed10 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2ed20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2ed30 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2ed40 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2ed50 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2ed60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2ed70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2ed80 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2ed90 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2eda0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2edb0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2edc0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2edd0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2ede0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2edf0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2ee00 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2ee10 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2ee20 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2ee30 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2ee40 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2ee50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2ee60 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2ee70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ee80 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2ee90 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2eea0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2eeb0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2eec0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2eed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2eee0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2eef0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2ef00 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2ef10 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2ef20 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2ef30 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2ef40 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2ef50 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2ef60 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2ef70 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2ef80 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2ef90 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2efa0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2efb0 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2efc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2efd0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2efe0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2eff0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2f000 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2f010 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2f020 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2f040 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f050 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2f060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f070 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2f080 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2f090 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2f0a0 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2f0b0 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2f0c0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2f0d0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2f0e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f0f0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2f100 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2f110 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2f120 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2f130 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2f140 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2f150 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2f160 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2f170 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2f180 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2f190 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2f1a0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2f1b0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2f1c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2f1d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f1e0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2f1f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2f210 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f220 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2f230 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2f240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2f250 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2f260 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2f270 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2f280 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2f290 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2f2a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2f2c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f2d0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2f2e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2f2f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f310 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f320 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f330 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f340 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2f350 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2f360 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2f370 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2f380 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f3a0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2f3b0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2f3c0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2f3d0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2f3e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2f3f0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2f400 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2f410 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2f420 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
2f430 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2f440 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
2f450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f460 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
2f470 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
2f480 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
2f490 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2f4a0 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
2f4b0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
2f4c0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
2f4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f4e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2f4f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2f500 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f510 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f530 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
2f540 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2f550 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2f560 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2f570 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
2f580 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
2f590 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f5a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2f5c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f5d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2f5e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f5f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f600 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
2f610 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2f620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f630 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f640 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2f650 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2f660 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f670 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f690 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2f6a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2f6b0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2f6c0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2f6d0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
2f6e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2f6f0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2f700 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2f710 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
2f720 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
2f730 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
2f740 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f750 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2f760 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2f770 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2f780 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2f790 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2f7a0 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
2f7b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2f7c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2f7d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f7e0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
2f7f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2f800 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f810 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f820 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2f830 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2f840 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2f860 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f870 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2f880 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2f890 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
2f8a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2f8b0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2f8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f8d0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
2f8e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2f8f0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2f900 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2f910 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2f920 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2f930 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2f940 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
2f950 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
2f960 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
2f970 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
2f980 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
2f990 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
2f9a0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
2f9b0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
2f9c0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
2f9d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
2f9e0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
2f9f0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
2fa00 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2fa10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fa20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2fa30 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2fa40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2fa50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2fa60 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2fa70 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2fa80 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2fa90 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
2faa0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
2fab0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2fac0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2fad0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2fae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2faf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fb00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fb10 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2fb30 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2fb40 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2fb50 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2fb60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2fb70 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2fb80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fb90 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2fba0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2fbb0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2fbc0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2fbd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2fbe0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2fbf0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2fc00 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2fc10 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2fc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2fc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fc40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fc60 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2fc70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2fc80 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2fc90 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
2fca0 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
2fcb0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2fcc0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2fcd0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
2fce0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2fcf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fd00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2fd10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2fd20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2fd30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fd40 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2fd50 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2fd60 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2fd70 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2fd80 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2fd90 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2fda0 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2fdb0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2fdc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2fdd0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2fde0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2fdf0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2fe00 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2fe10 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2fe20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2fe30 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2fe40 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2fe50 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2fe60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fe70 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2fe80 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2fe90 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2fea0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2feb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2fec0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2fed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2fee0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2fef0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2ff00 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2ff10 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2ff20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2ff30 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2ff40 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2ff50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2ff60 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2ff70 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2ff80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2ff90 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2ffa0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2ffb0 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
2ffc0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
2ffd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2ffe0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
2fff0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
30000 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
30010 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
30020 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30050 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
30060 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
30070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30090 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
300a0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
300b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
300c0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
300d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
300e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
300f0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
30100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30110 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
30120 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
30130 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
30140 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
30150 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
30160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30170 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
30180 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
30190 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
301a0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
301b0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
301c0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
301d0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
301e0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
301f0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
30200 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
30210 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
30220 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
30230 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
30240 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
30250 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
30260 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
30270 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
30280 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
30290 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
302a0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
302b0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
302c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
302d0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
302e0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
302f0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
30300 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
30310 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
30320 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
30330 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
30340 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
30350 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
30360 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
30370 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
30380 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
30390 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
303a0 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
303b0 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
303c0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
303d0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
303e0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
303f0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
30400 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
30410 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
30420 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
30430 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
30440 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
30450 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
30460 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
30470 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
30480 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
30490 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
304a0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
304b0 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
304c0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
304d0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
304e0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
304f0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
30500 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
30510 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
30520 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
30530 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
30540 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
30550 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
30560 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
30570 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
30580 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
30590 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
305a0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
305b0 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
305c0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
305d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
305e0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
305f0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
30600 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
30620 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
30630 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
30640 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
30650 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
30660 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
30670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30680 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
30690 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
306a0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
306b0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
306c0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
306d0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
306e0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
306f0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
30700 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
30710 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
30720 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
30730 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
30740 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
30750 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
30760 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
30770 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
30780 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
30790 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
307a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
307b0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
307c0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
307d0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
307e0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
307f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
30800 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
30810 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30820 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
30830 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
30840 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
30850 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
30860 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
30870 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
30880 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
30890 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
308a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
308b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
308c0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
308d0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
308e0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
308f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
30900 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30910 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
30920 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
30930 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
30940 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30950 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
30960 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
30970 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
30980 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
30990 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
309a0 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
309b0 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
309c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
309d0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
309e0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
309f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
30a00 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
30a10 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
30a20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
30a30 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30a40 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
30a50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30a60 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
30a70 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
30a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30a90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30aa0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
30ab0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
30ac0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
30ad0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
30ae0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
30af0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
30b00 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
30b10 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
30b20 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
30b30 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
30b40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30b50 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
30b60 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
30b70 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
30b80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
30b90 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
30ba0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
30bb0 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
30bc0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
30bd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
30be0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
30bf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
30c00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
30c10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
30c20 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
30c30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
30c40 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
30c50 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
30c60 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
30c70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
30c80 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
30c90 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
30ca0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
30cb0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
30cc0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
30cd0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
30ce0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
30cf0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
30d00 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
30d10 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
30d20 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
30d30 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
30d40 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
30d50 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
30d60 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
30d70 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
30d80 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
30d90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
30da0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
30db0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
30dc0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
30dd0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
30de0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
30df0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
30e00 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
30e10 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
30e20 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
30e30 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
30e40 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
30e50 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
30e60 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
30e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e80 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
30e90 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
30ea0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ec0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
30ed0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
30ee0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
30ef0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
30f00 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
30f10 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
30f20 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
30f30 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
30f40 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
30f50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
30f60 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
30f70 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
30f80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
30f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fa0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
30fb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
30fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30fe0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
30ff0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
31000 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
31010 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
31020 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
31030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
31040 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
31050 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
31060 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
31070 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
31080 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
31090 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
310a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
310b0 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
310c0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
310d0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
310e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
310f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
31100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
31110 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
31120 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
31130 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
31140 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
31150 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
31160 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
31170 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31180 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31190 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
311a0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
311b0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
311c0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
311d0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
311e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
311f0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
31200 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
31210 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
31220 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
31230 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
31240 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
31250 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
31260 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
31270 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
31280 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
31290 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
312a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
312b0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
312c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
312d0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
312e0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
312f0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
31300 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31310 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
31320 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
31330 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
31340 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
31350 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
31360 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
31370 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
31380 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
31390 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
313a0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
313b0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
313c0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
313d0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
313e0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
313f0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
31400 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
31410 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
31420 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
31430 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
31440 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
31450 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31460 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31470 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
31480 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
31490 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
314a0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
314b0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
314c0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
314d0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
314e0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
314f0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
31500 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
31510 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
31520 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
31530 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
31540 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
31550 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
31560 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
31570 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
31580 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
31590 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
315a0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
315b0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
315c0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
315d0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
315e0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
315f0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
31600 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
31610 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
31620 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
31630 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
31640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31650 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
31660 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
31670 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
31680 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
31690 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
316a0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
316b0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
316c0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
316d0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
316e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
316f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
31700 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31710 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
31720 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
31730 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
31740 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
31750 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
31760 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
31770 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31780 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
31790 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
317a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
317b0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
317c0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
317d0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
317e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
317f0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
31800 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31810 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
31820 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
31830 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
31840 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
31850 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
31860 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
31870 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
31880 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
31890 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
318a0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
318b0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
318c0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
318d0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
318e0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
318f0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
31900 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
31910 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
31920 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
31930 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
31940 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
31950 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
31960 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
31970 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
31980 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
31990 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
319a0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
319b0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
319c0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
319d0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
319e0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
319f0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
31a00 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
31a10 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31a20 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
31a30 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
31a40 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
31a50 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
31a60 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
31a70 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
31a80 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
31a90 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
31aa0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
31ab0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
31ac0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
31ad0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
31ae0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
31af0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
31b00 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
31b10 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
31b20 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
31b30 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
31b40 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
31b50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
31b60 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
31b70 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
31b80 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
31b90 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
31ba0 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
31bb0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
31bc0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
31bd0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31be0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
31bf0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
31c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
31c10 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
31c20 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
31c30 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
31c40 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
31c50 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
31c60 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
31c70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31c80 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
31c90 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
31ca0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31cc0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
31cd0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
31ce0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
31cf0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
31d00 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
31d10 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
31d20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
31d30 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
31d40 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
31d50 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
31d60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
31d70 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
31d80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
31d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
31da0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
31db0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
31dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31dd0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
31de0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
31df0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
31e00 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
31e10 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
31e20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31e30 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
31e40 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
31e50 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
31e60 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
31e70 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
31e80 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
31e90 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
31ea0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
31eb0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
31ec0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
31ed0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
31ee0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
31ef0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
31f00 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
31f10 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
31f20 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
31f30 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
31f40 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
31f50 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
31f60 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
31f70 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
31f80 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
31f90 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
31fa0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
31fb0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
31fc0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
31fd0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
31fe0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
31ff0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
32000 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
32010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32020 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
32030 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
32040 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32050 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
32060 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
32070 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
32080 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
32090 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
320a0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
320b0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
320c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
320d0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
320e0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
320f0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
32100 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
32110 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
32120 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
32130 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
32140 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
32150 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
32160 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
32170 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
32180 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
32190 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
321a0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
321b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
321c0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
321d0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
321e0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
321f0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
32200 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
32210 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
32220 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
32230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
32240 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32250 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
32260 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
32270 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
32280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
32290 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
322a0 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
322b0 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
322c0 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
322d0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
322e0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
322f0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
32300 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
32310 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
32320 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
32330 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
32340 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
32350 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
32360 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
32370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
32380 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
32390 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
323a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
323b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
323c0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
323d0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
323e0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
323f0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
32400 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
32410 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32420 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
32430 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
32440 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
32450 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
32460 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
32470 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
32480 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
32490 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
324a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
324b0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
324c0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
324d0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
324e0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
324f0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
32500 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
32510 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
32520 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
32530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32540 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
32550 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
32560 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
32570 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
32580 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
32590 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
325a0 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
325b0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
325c0 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
325d0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
325e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
325f0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
32600 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
32610 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
32620 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
32630 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
32640 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
32650 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
32660 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
32670 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
32680 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
32690 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
326a0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
326b0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
326c0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
326d0 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
326e0 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
326f0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
32700 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
32710 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
32720 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
32730 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
32740 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
32750 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
32760 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
32770 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
32780 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
32790 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
327a0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
327b0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
327c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
327d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
327e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
327f0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
32800 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
32810 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
32820 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
32830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32840 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32850 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
32860 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
32870 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
32880 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
32890 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
328a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
328b0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
328c0 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
328d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
328e0 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
328f0 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
32900 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
32910 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
32920 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
32930 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
32940 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
32950 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
32960 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
32970 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
32980 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
32990 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
329a0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
329b0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
329c0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
329d0 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
329e0 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
329f0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
32a00 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
32a10 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
32a20 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
32a30 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
32a40 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
32a50 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
32a60 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
32a70 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
32a80 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
32a90 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
32aa0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
32ab0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
32ac0 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
32ad0 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
32ae0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
32af0 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
32b00 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
32b10 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
32b20 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
32b30 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
32b40 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
32b50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
32b60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
32b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
32b80 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
32b90 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
32ba0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
32bb0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
32bc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
32bd0 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
32be0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
32bf0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32c00 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
32c10 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
32c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
32c40 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
32c50 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
32c60 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
32c70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
32c80 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
32c90 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
32ca0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
32cb0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
32cc0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
32cd0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
32ce0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
32cf0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
32d00 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
32d10 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
32d20 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
32d30 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
32d40 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
32d50 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
32d60 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
32d70 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
32d80 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
32d90 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
32da0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
32db0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
32dc0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
32dd0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
32de0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
32df0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
32e00 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
32e10 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
32e20 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
32e30 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
32e40 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
32e50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
32e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e70 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32e80 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
32e90 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
32ea0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
32eb0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
32ec0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
32ed0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
32ee0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
32ef0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
32f00 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
32f10 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
32f20 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
32f30 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
32f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32f50 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
32f60 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
32f70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
32f80 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
32f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fa0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
32fb0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
32fc0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
32fd0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
32fe0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
32ff0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
33000 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
33010 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
33020 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
33030 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
33040 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
33050 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33060 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
33070 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
33080 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
33090 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
330a0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
330b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
330c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
330d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
330e0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
330f0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
33100 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
33110 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
33120 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
33130 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
33140 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
33150 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
33160 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
33170 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
33180 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
33190 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
331a0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
331b0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
331c0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
331d0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
331e0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
331f0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
33200 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
33210 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
33220 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
33230 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
33240 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
33250 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
33260 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
33270 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
33280 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
33290 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
332a0 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
332b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
332c0 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
332d0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
332e0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
332f0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
33300 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
33310 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
33320 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
33330 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
33340 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
33350 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
33360 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
33370 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
33380 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c     assert( nKey<
33390 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
333a0 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50  Key!=0 );.    nP
333b0 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
333c0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
333d0 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
333e0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
333f0 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
33400 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
33410 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
33420 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
33430 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
33440 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
33450 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
33460 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
33470 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
33480 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
33490 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
334a0 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
334b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
334c0 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
334d0 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
334e0 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
334f0 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
33500 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
33510 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
33520 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
33530 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
33540 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
33550 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
33560 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
33570 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
33580 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
33590 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
335a0 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
335b0 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
335c0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
335d0 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
335e0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
335f0 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
33600 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
33610 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
33620 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
33630 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
33640 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
33650 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
33660 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
33670 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
33680 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
33690 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
336a0 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
336b0 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
336c0 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
336d0 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
336e0 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
336f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
33700 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
33710 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
33720 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
33730 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
33740 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
33750 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
33760 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
33770 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
33780 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
33790 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
337a0 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
337b0 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
337c0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
337d0 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
337e0 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
337f0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
33800 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
33810 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
33820 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
33830 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
33840 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
33850 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
33860 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
33870 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
33880 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
33890 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
338a0 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e  ert( nHeader=(in
338b0 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
338c0 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
338d0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
338e0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
338f0 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
33900 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
33910 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
33920 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
33930 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  Local );.    ass
33940 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26  ert( pPrior == &
33950 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
33960 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e  flow] );.  }.#en
33970 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
33980 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
33990 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
339a0 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
339b0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
339c0 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
339d0 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
339e0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
339f0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
33a00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33a10 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
33a20 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
33a30 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
33a40 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
33a50 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
33a60 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
33a70 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
33a80 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
33a90 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
33aa0 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
33ab0 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
33ac0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
33ad0 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
33ae0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
33af0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
33b00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
33b10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
33b20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
33b30 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
33b40 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
33b50 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
33b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33b70 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
33b80 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
33b90 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
33ba0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
33bb0 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
33bc0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
33bd0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
33be0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
33bf0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
33c00 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
33c10 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
33c20 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
33c30 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
33c40 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
33c50 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
33c60 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
33c70 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
33c80 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
33c90 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
33ca0 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
33cb0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
33cc0 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
33cd0 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
33ce0 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
33cf0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
33d00 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
33d10 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
33d20 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
33d30 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
33d40 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
33d50 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
33d60 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
33d70 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
33d80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
33d90 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
33da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33db0 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
33dc0 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
33dd0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
33de0 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
33df0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
33e00 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
33e10 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
33e20 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
33e30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
33e40 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
33e50 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
33e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33e70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
33e80 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
33e90 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
33ea0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
33eb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
33ec0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
33ed0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
33ee0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
33ef0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
33f00 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
33f10 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
33f20 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
33f30 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
33f40 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
33f50 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
33f60 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
33f70 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33f80 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
33f90 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
33fa0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
33fb0 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
33fc0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
33fd0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
33fe0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
33ff0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
34000 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
34010 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
34020 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
34030 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
34040 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
34050 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
34060 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
34070 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34080 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34090 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
340a0 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
340b0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
340c0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
340d0 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
340e0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
340f0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
34100 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
34110 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
34120 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
34130 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
34140 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
34150 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
34160 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
34170 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
34180 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
34190 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
341a0 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
341b0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
341c0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
341d0 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
341e0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
341f0 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
34200 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
34210 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
34220 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34230 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
34240 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
34250 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
34260 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
34270 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
34280 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
34290 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
342a0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
342b0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
342c0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
342d0 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
342e0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
342f0 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
34300 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
34310 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
34320 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
34330 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
34340 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
34350 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34360 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34370 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
34380 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
34390 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
343a0 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
343b0 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
343c0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
343d0 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
343e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
343f0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
34400 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
34410 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
34420 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
34430 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
34440 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
34450 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
34460 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
34470 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
34480 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
34490 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
344a0 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
344b0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
344c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
344d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
344e0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
344f0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
34500 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
34510 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
34520 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
34530 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
34540 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
34550 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
34560 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
34570 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
34580 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
34590 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
345a0 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
345b0 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
345c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
345d0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
345e0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
345f0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
34600 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
34610 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
34620 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
34630 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
34640 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
34650 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
34660 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
34670 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
34680 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
34690 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
346a0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
346b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
346c0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
346d0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
346e0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
346f0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
34700 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
34710 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
34720 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
34730 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
34740 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
34750 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
34760 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
34770 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
34780 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
34790 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
347a0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
347b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
347c0 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
347d0 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
347e0 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
347f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34800 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
34810 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
34820 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34830 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
34840 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
34850 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
34860 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
34870 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
34880 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
34890 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
348a0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
348b0 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
348c0 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
348d0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
348e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
348f0 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
34900 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
34910 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
34920 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
34930 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
34940 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
34950 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
34960 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
34970 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
34980 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
34990 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
349a0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
349b0 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
349c0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
349d0 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
349e0 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
349f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
34a00 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
34a10 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
34a20 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
34a30 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
34a40 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
34a50 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
34a60 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
34a70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
34a80 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
34a90 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
34aa0 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
34ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
34ac0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
34ad0 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
34ae0 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
34af0 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
34b00 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
34b10 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
34b20 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
34b30 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
34b40 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
34b50 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
34b60 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
34b70 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
34b80 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
34b90 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
34ba0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
34bb0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
34bc0 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
34bd0 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
34be0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
34bf0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
34c00 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
34c10 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
34c20 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
34c30 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
34c40 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
34c50 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
34c60 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
34c70 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
34c80 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
34c90 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
34ca0 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
34cb0 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
34cc0 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
34cd0 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
34ce0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
34cf0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
34d00 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
34d10 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
34d20 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
34d30 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
34d40 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
34d50 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
34d60 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
34d70 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
34d80 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
34d90 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
34da0 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
34db0 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
34dc0 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
34dd0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
34de0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
34df0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
34e00 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
34e10 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
34e20 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
34e30 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
34e40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
34e50 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
34e60 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
34e70 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
34e80 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
34e90 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
34ea0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
34eb0 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
34ec0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
34ed0 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
34ee0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
34ef0 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
34f00 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
34f10 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
34f20 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
34f30 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
34f40 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
34f50 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
34f60 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
34f70 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
34f80 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
34f90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
34fa0 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  nter */.  u8 *da
34fb0 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
34fc0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
34fd0 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
34fe0 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20    u8 *pIns;     
34ff0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
35000 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
35010 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63  Idx[] where no c
35020 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ell inserted */.
35030 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
35040 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
35050 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
35060 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
35070 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
35080 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70  ssert( MX_CELL(p
35090 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
350a0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
350b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
350c0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
350d0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
350e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
350f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
35100 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
35110 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
35120 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
35130 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
35140 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
35150 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
35160 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35170 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
35180 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
35190 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
351a0 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
351b0 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
351c0 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
351d0 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
351e0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
351f0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
35200 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
35210 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
35220 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
35230 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
35240 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
35250 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
35260 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
35270 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
35280 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
35290 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
352a0 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
352b0 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
352c0 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
352d0 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
352e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
352f0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
35300 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  z==pPage->xCellS
35310 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ize(pPage, pCell
35320 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
35330 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
35340 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
35350 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
35360 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
35370 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
35380 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
35390 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
353a0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
353b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
353c0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
353d0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
353e0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
353f0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
35400 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
35410 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
35420 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
35430 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
35440 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
35450 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
35460 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
35470 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
35480 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20  [j] = (u16)i;.. 
35490 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69     /* When multi
354a0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63  ple overflows oc
354b0 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c  cur, they are al
354c0 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20  ways sequential 
354d0 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  and in.    ** so
354e0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69  rted order.  Thi
354f0 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69  s invariants ari
35500 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69  se because multi
35510 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61  ple overflows ca
35520 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63  n.    ** only oc
35530 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69  cur when inserti
35540 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ng divider cells
35550 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
35560 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20   page during.   
35570 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61   ** balancing, a
35580 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20  nd the dividers 
35590 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64  are adjacent and
355a0 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   sorted..    */.
355b0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
355c0 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66   || pPage->aiOvf
355d0 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b  l[j-1]<(u16)i );
355e0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e   /* Overflows in
355f0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f   sorted order */
35600 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
35610 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61  0 || i==pPage->a
35620 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20  iOvfl[j-1]+1 ); 
35630 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61    /* Overflows a
35640 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f  re sequential */
35650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
35660 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
35670 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
35680 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
35690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
356a0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
356b0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
356c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
356d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
356e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
356f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
35700 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
35710 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >aData;.    asse
35720 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d  rt( &data[pPage-
35730 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50  >cellOffset]==pP
35740 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b  age->aCellIdx );
35750 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
35760 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
35770 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
35780 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
35790 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
357a0 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
357b0 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
357c0 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
357d0 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74  ollowing propert
357e0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
357f0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
35800 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73  fully */.    ass
35810 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b  ert( idx >= 0 );
35820 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
35830 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f   >= pPage->cellO
35840 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
35850 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50  Cell+2 || CORRUP
35860 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
35870 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
35880 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
35890 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
358a0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
358b0 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
358c0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
358d0 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a  [idx], pCell, sz
358e0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
358f0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
35900 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
35910 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
35920 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d     pIns = pPage-
35930 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b  >aCellIdx + i*2;
35940 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e  .    memmove(pIn
35950 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50  s+2, pIns, 2*(pP
35960 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29  age->nCell - i))
35970 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
35980 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  Ins, idx);.    p
35990 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
359a0 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20     /* increment 
359b0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a  the cell count *
359c0 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74  /.    if( (++dat
359d0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
359e0 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61  et+4])==0 ) data
359f0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
35a00 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65  t+3]++;.    asse
35a10 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
35a20 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
35a30 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+3])==pPage->
35a40 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66  nCell );.#ifndef
35a50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
35a60 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
35a70 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
35a80 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
35a90 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
35aa0 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
35ab0 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
35ac0 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
35ad0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
35ae0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
35af0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
35b00 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
35b10 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
35b20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
35b30 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
35b40 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
35b50 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
35b60 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a   A CellArray obj
35b70 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ect contains a c
35b80 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73  ache of pointers
35b90 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61   and sizes for a
35ba0 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20  .** consecutive 
35bb0 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c  sequence of cell
35bc0 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  s that might be 
35bd0 68 65 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70 61  held multiple pa
35be0 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ges..*/.typedef 
35bf0 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
35c00 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75   CellArray;.stru
35c10 63 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20  ct CellArray {. 
35c20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
35c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
35c40 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
35c50 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  pCell[] */.  Mem
35c60 50 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20  Page *pRef;     
35c70 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
35c80 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
35c90 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *apCell;        
35ca0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
35cb0 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
35cc0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
35cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
35ce0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
35cf0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
35d00 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  l[] */.};../*.**
35d10 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
35d20 65 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78  ell sizes at idx
35d30 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64  , idx+1, ..., id
35d40 78 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a  x+N-1 have been.
35d50 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a  ** computed..*/.
35d60 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75  static void popu
35d70 6c 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65  lateCellCache(Ce
35d80 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
35d90 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61  idx, int N){.  a
35da0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
35db0 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c   idx+N<=p->nCell
35dc0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30   );.  while( N>0
35dd0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
35de0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d  p->apCell[idx]!=
35df0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
35e00 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29  szCell[idx]==0 )
35e10 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c  {.      p->szCel
35e20 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66  l[idx] = p->pRef
35e30 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
35e40 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  Ref, p->apCell[i
35e50 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dx]);.    }else{
35e60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43  .      assert( C
35e70 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20  ORRUPT_DB ||.   
35e80 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a             p->sz
35e90 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52  Cell[idx]==p->pR
35ea0 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
35eb0 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
35ec0 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a  [idx]) );.    }.
35ed0 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e      idx++;.    N
35ee0 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
35ef0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
35f00 20 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d   of the Nth elem
35f10 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ent of the cell 
35f20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20  array.*/.static 
35f30 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
35f40 75 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53  u16 computeCellS
35f50 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  ize(CellArray *p
35f60 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
35f70 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d  rt( N>=0 && N<p-
35f80 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
35f90 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  rt( p->szCell[N]
35fa0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65  ==0 );.  p->szCe
35fb0 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  ll[N] = p->pRef-
35fc0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
35fd0 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d  ef, p->apCell[N]
35fe0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73  );.  return p->s
35ff0 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74  zCell[N];.}.stat
36000 69 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c  ic u16 cachedCel
36010 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20  lSize(CellArray 
36020 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  *p, int N){.  as
36030 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c  sert( N>=0 && N<
36040 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  p->nCell );.  if
36050 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29  ( p->szCell[N] )
36060 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
36070 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63  l[N];.  return c
36080 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70  omputeCellSize(p
36090 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , N);.}../*.** A
360a0 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
360b0 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
360c0 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20  to nCell b-tree 
360d0 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20  page cells. The 
360e0 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72  .** szCell[] arr
360f0 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ay contains the 
36100 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
36110 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   each cell. This
36120 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70   function.** rep
36130 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e  laces the curren
36140 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  t contents of pa
36150 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20  ge pPg with the 
36160 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
36170 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a  cell.** array..*
36180 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65  *.** Some of the
36190 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
361a0 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  [] may currently
361b0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
361c0 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  g. This.** funct
361d0 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64  ion works around
361e0 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
361f0 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69   by this by maki
36200 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79  ng a copy of any
36210 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20   .** such cells 
36220 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
36230 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ng the page data
36240 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50  ..**.** The MemP
36250 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20  age.nFree field 
36260 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  is invalidated b
36270 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
36280 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
36290 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
362a0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
362b0 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
362c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
362d0 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65  ebuildPage(.  Me
362e0 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
362f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36300 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20   Edit this page 
36310 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
36320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36330 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
36340 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
36350 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
36360 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
36370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
36380 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
36390 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
363a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363b0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
363c0 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
363d0 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
363e0 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
363f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
36400 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
36410 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63   pPg */.  u8 * c
36420 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
36430 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
36440 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
36450 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f   data for pPg */
36460 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61  .  const int usa
36470 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
36480 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
36490 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
364a0 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c  d = &aData[usabl
364b0 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b  eSize];.  int i;
364c0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20  .  u8 *pCellptr 
364d0 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
364e0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
364f0 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
36500 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
36510 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61  ager);.  u8 *pDa
36520 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62  ta;..  i = get2b
36530 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
36540 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54  ]);.  memcpy(&pT
36550 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d  mp[i], &aData[i]
36560 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69  , usableSize - i
36570 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45  );..  pData = pE
36580 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nd;.  for(i=0; i
36590 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
365a0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70    u8 *pCell = ap
365b0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
365c0 20 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20   pCell>aData && 
365d0 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20  pCell<pEnd ){.  
365e0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
365f0 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
36600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74  ;.    }.    pDat
36610 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  a -= szCell[i];.
36620 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
36630 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20  llptr, (pData - 
36640 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
36650 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
36660 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c  if( pData < pCel
36670 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53 51  lptr ) return SQ
36680 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36690 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  T;.    memcpy(pD
366a0 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65  ata, pCell, szCe
366b0 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[i]);.    asse
366c0 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70  rt( szCell[i]==p
366d0 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  Pg->xCellSize(pP
366e0 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52  g, pCell) || COR
366f0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74  RUPT_DB );.    t
36700 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b  estcase( szCell[
36710 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69  i]!=pPg->xCellSi
36720 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b  ze(pPg,pCell) );
36730 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70  .  }..  /* The p
36740 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
36750 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72  is now set incor
36760 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c  rectly. The call
36770 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20  er will fix it. 
36780 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  */.  pPg->nCell 
36790 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e  = nCell;.  pPg->
367a0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
367b0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
367c0 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20  a[hdr+1], 0);.  
367d0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
367e0 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
367f0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
36800 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
36810 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20  Data - aData);. 
36820 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20   aData[hdr+7] = 
36830 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53  0x00;.  return S
36840 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
36850 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
36860 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
36870 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
36880 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
36890 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61   szCell.** conta
368a0 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
368b0 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
368c0 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
368d0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
368e0 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63  to .** add the c
368f0 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ells stored in t
36900 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65  he array to page
36910 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e   pPg. If it cann
36920 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20  ot (because .** 
36930 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
36940 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65  o be defragmente
36950 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c  d before the cel
36960 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f  ls will fit), no
36970 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74  n-zero.** is ret
36980 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
36990 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61  , if the cells a
369a0 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73  re added success
369b0 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a  fully, zero is.*
369c0 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
369d0 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c  * Argument pCell
369e0 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ptr points to th
369f0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
36a00 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
36a10 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74  r array.** (part
36a20 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f   of page pPg) to
36a30 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72   populate. After
36a40 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20   cell apCell[0] 
36a50 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
36a60 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20  e.** page body, 
36a70 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20  a 16-bit offset 
36a80 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43  is written to pC
36a90 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f  ellptr. And so o
36aa0 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  n, for each.** c
36ab0 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
36ac0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
36ad0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
36ae0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
36af0 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  re.** that it is
36b00 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69   safe to overwri
36b10 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  te this part of 
36b20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
36b30 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68   array..**.** Wh
36b40 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
36b50 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44   is called, *ppD
36b60 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ata points to th
36b70 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a  e start of the .
36b80 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ** content area 
36b90 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20  on page pPg. If 
36ba0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
36bb0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
36bc0 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70  extended,.** *pp
36bd0 44 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20  Data is updated 
36be0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
36bf0 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65  new start of the
36c00 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a   content area.**
36c10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
36c20 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79  g..**.** Finally
36c30 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69  , argument pBegi
36c40 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  n points to the 
36c50 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
36c60 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a   following the.*
36c70 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61  * end of the spa
36c80 63 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ce required by t
36c90 68 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65  his page for the
36ca0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
36cb0 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63  ea (for.** all c
36cc0 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20  ells - not just 
36cd0 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62  those inserted b
36ce0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  y the current ca
36cf0 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74  ll). If the cont
36d00 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74  ent.** area must
36d10 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
36d20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e  before this poin
36d30 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63  t in order to ac
36d40 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20  comodate all.** 
36d50 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
36d60 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ], then the cell
36d70 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64  s do not fit and
36d80 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
36d90 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
36da0 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41   int pageInsertA
36db0 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20  rray(.  MemPage 
36dc0 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
36dd0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36de0 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20  to add cells to 
36df0 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c  */.  u8 *pBegin,
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e10 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63       /* End of c
36e20 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
36e30 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61  y */.  u8 **ppDa
36e40 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
36e50 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
36e60 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d  : Page content -
36e70 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  area pointer */.
36e80 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20    u8 *pCellptr, 
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ea0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
36eb0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
36ec0 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  a */.  int iFirs
36ed0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
36ee0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
36ef0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
36f00 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43   add */.  int nC
36f10 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
36f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
36f30 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
36f40 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20  add to pPg */.  
36f50 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72  CellArray *pCArr
36f60 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
36f70 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
36f80 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
36f90 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70  .  u8 *aData = p
36fa0 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  Pg->aData;.  u8 
36fb0 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61  *pData = *ppData
36fc0 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  ;.  int iEnd = i
36fd0 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20  First + nCell;. 
36fe0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
36ff0 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f  _DB || pPg->hdrO
37000 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f  ffset==0 );    /
37010 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f  * Never called o
37020 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f  n page 1 */.  fo
37030 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
37040 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  nd; i++){.    in
37050 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38  t sz, rc;.    u8
37060 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20   *pSlot;.    sz 
37070 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  = cachedCellSize
37080 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20  (pCArray, i);.  
37090 20 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d    if( (aData[1]=
370a0 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d  =0 && aData[2]==
370b0 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70  0) || (pSlot = p
370c0 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c  ageFindSlot(pPg,
370d0 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20  sz,&rc))==0 ){. 
370e0 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a       pData -= sz
370f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
37100 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75 72  a<pBegin ) retur
37110 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74  n 1;.      pSlot
37120 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
37130 20 20 20 20 6d 65 6d 63 70 79 28 70 53 6c 6f 74      memcpy(pSlot
37140 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  , pCArray->apCel
37150 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70  l[i], sz);.    p
37160 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
37170 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61  , (pSlot - aData
37180 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
37190 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70   += 2;.  }.  *pp
371a0 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
371b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
371c0 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
371d0 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
371e0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
371f0 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
37200 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74   szCell .** cont
37210 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
37220 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
37230 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
37240 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65  unction adds the
37250 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69  .** space associ
37260 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  ated with each c
37270 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
37280 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
37290 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69  ly stored .** wi
372a0 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66  thin the body of
372b0 20 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20   pPg to the pPg 
372c0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63  free-list. The c
372d0 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell-pointers and
372e0 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73   other.** fields
372f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65   of the page are
37300 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a   not updated..**
37310 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
37320 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
37330 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  tal number of ce
37340 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  lls added to the
37350 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73   free-list..*/.s
37360 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72  tatic int pageFr
37370 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61  eeArray(.  MemPa
37380 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
37390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
373a0 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20  ge to edit */.  
373b0 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20  int iFirst,     
373c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373d0 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c 20 74 6f  /* First cell to
373e0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
373f0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
37400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37410 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20  Cells to delete 
37420 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a  */.  CellArray *
37430 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20  pCArray         
37440 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
37450 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75   cells */.){.  u
37460 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
37470 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
37480 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
37490 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42  = &aData[pPg->pB
374a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
374b0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74    u8 * const pSt
374c0 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67  art = &aData[pPg
374d0 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20  ->hdrOffset + 8 
374e0 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53  + pPg->childPtrS
374f0 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74  ize];.  int nRet
37500 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
37510 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72   int iEnd = iFir
37520 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75 38  st + nCell;.  u8
37530 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69   *pFree = 0;.  i
37540 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a  nt szFree = 0;..
37550 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
37560 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<iEnd; i++){.  
37570 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43    u8 *pCell = pC
37580 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37590 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e  ;.    if( pCell>
375a0 3d 70 53 74 61 72 74 20 26 26 20 70 43 65 6c 6c  =pStart && pCell
375b0 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69  <pEnd ){.      i
375c0 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a 20  nt sz;.      /* 
375d0 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73 65 20 63  No need to use c
375e0 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 29 20  achedCellSize() 
375f0 68 65 72 65 2e 20 20 54 68 65 20 73 69 7a 65 73  here.  The sizes
37600 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 74 68   of all cells th
37610 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20  at.      ** are 
37620 74 6f 20 62 65 20 66 72 65 65 64 20 68 61 76 65  to be freed have
37630 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
37640 6d 70 75 74 69 6e 67 20 77 68 69 6c 65 20 64 65  mputing while de
37650 63 69 64 69 6e 67 20 77 68 69 63 68 0a 20 20 20  ciding which.   
37660 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e 65 65 64     ** cells need
37670 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 20 20   freeing */.    
37680 20 20 73 7a 20 3d 20 70 43 41 72 72 61 79 2d 3e    sz = pCArray->
37690 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61 73 73 65  szCell[i];  asse
376a0 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20 20 20 20  rt( sz>0 );.    
376b0 20 20 69 66 28 20 70 46 72 65 65 21 3d 28 70 43    if( pFree!=(pC
376c0 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20  ell + sz) ){.   
376d0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
376e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
376f0 72 74 28 20 70 46 72 65 65 3e 61 44 61 74 61 20  rt( pFree>aData 
37700 26 26 20 28 70 46 72 65 65 20 2d 20 61 44 61 74  && (pFree - aDat
37710 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
37720 20 20 20 20 20 20 66 72 65 65 53 70 61 63 65 28        freeSpace(
37730 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65 65  pPg, (u16)(pFree
37740 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65   - aData), szFre
37750 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
37760 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 43        pFree = pC
37770 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46  ell;.        szF
37780 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ree = sz;.      
37790 20 20 69 66 28 20 70 46 72 65 65 2b 73 7a 3e 70    if( pFree+sz>p
377a0 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  End ) return 0;.
377b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
377c0 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65       pFree = pCe
377d0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72  ll;.        szFr
377e0 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ee += sz;.      
377f0 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a  }.      nRet++;.
37800 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
37810 70 46 72 65 65 20 29 7b 0a 20 20 20 20 61 73 73  pFree ){.    ass
37820 65 72 74 28 20 70 46 72 65 65 3e 61 44 61 74 61  ert( pFree>aData
37830 20 26 26 20 28 70 46 72 65 65 20 2d 20 61 44 61   && (pFree - aDa
37840 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
37850 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
37860 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
37870 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
37880 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
37890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c  ;.}../*.** apCel
378a0 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
378b0 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
378c0 72 73 20 74 6f 20 61 6e 64 20 73 69 7a 65 73 20  rs to and sizes 
378d0 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
378e0 74 68 65 0a 2a 2a 20 70 61 67 65 73 20 62 65 69  the.** pages bei
378f0 6e 67 20 62 61 6c 61 6e 63 65 64 2e 20 20 54 68  ng balanced.  Th
37900 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2c 20  e current page, 
37910 70 50 67 2c 20 68 61 73 20 70 50 67 2d 3e 6e 43  pPg, has pPg->nC
37920 65 6c 6c 20 63 65 6c 6c 73 20 73 74 61 72 74 69  ell cells starti
37930 6e 67 0a 2a 2a 20 77 69 74 68 20 61 70 43 65 6c  ng.** with apCel
37940 6c 5b 69 4f 6c 64 5d 2e 20 20 41 66 74 65 72 20  l[iOld].  After 
37950 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 69 73 20  balancing, this 
37960 70 61 67 65 20 73 68 6f 75 6c 64 20 68 6f 6c 64  page should hold
37970 20 6e 4e 65 77 20 63 65 6c 6c 73 0a 2a 2a 20 73   nNew cells.** s
37980 74 61 72 74 69 6e 67 20 61 74 20 61 70 43 65 6c  tarting at apCel
37990 6c 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54  l[iNew]..**.** T
379a0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
379b0 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
379c0 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 70  adjustments to p
379d0 50 67 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  Pg so that it co
379e0 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
379f0 72 72 65 63 74 20 63 65 6c 6c 73 20 61 66 74 65  rrect cells afte
37a00 72 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  r being balanced
37a10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 67 2d  ..**.** The pPg-
37a20 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
37a30 69 6e 76 61 6c 69 64 20 77 68 65 6e 20 74 68 69  invalid when thi
37a40 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
37a50 6e 73 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a  ns. It is the.**
37a60 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
37a70 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
37a80 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c   set it correctl
37a90 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
37aa0 20 65 64 69 74 50 61 67 65 28 0a 20 20 4d 65 6d   editPage(.  Mem
37ab0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
37ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37ad0 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a  Edit this page *
37ae0 2f 0a 20 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20  /.  int iOld,   
37af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b00 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
37b10 66 69 72 73 74 20 63 65 6c 6c 20 63 75 72 72 65  first cell curre
37b20 6e 74 6c 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  ntly on page */.
37b30 20 20 69 6e 74 20 69 4e 65 77 2c 20 20 20 20 20    int iNew,     
37b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b50 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
37b60 77 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20  w first cell on 
37b70 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  page */.  int nN
37b80 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ew,             
37b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
37ba0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  al number of cel
37bb0 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ls on page */.  
37bc0 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72  CellArray *pCArr
37bd0 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
37be0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
37bf0 73 20 61 6e 64 20 73 69 7a 65 73 20 2a 2f 0a 29  s and sizes */.)
37c00 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  {.  u8 * const a
37c10 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
37c20 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  a;.  const int h
37c30 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
37c40 73 65 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69  set;.  u8 *pBegi
37c50 6e 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  n = &pPg->aCellI
37c60 64 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20  dx[nNew * 2];.  
37c70 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d  int nCell = pPg-
37c80 3e 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  >nCell;       /*
37c90 20 43 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   Cells stored on
37ca0 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44   pPg */.  u8 *pD
37cb0 61 74 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  ata;.  u8 *pCell
37cc0 70 74 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ptr;.  int i;.  
37cd0 69 6e 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f  int iOldEnd = iO
37ce0 6c 64 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  ld + pPg->nCell 
37cf0 2b 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77  + pPg->nOverflow
37d00 3b 0a 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20  ;.  int iNewEnd 
37d10 3d 20 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a  = iNew + nNew;..
37d20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
37d30 42 55 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  BUG.  u8 *pTmp =
37d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
37d50 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
37d60 3e 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63  >pPager);.  memc
37d70 70 79 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20  py(pTmp, aData, 
37d80 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
37d90 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
37da0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73   /* Remove cells
37db0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
37dc0 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70  and end of the p
37dd0 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c  age */.  if( iOl
37de0 64 3c 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  d<iNew ){.    in
37df0 74 20 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46  t nShift = pageF
37e00 72 65 65 41 72 72 61 79 28 70 50 67 2c 20 69 4f  reeArray(pPg, iO
37e10 6c 64 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 70  ld, iNew-iOld, p
37e20 43 41 72 72 61 79 29 3b 0a 20 20 20 20 6d 65 6d  CArray);.    mem
37e30 6d 6f 76 65 28 70 50 67 2d 3e 61 43 65 6c 6c 49  move(pPg->aCellI
37e40 64 78 2c 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  dx, &pPg->aCellI
37e50 64 78 5b 6e 53 68 69 66 74 2a 32 5d 2c 20 6e 43  dx[nShift*2], nC
37e60 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 6e 43 65 6c  ell*2);.    nCel
37e70 6c 20 2d 3d 20 6e 53 68 69 66 74 3b 0a 20 20 7d  l -= nShift;.  }
37e80 0a 20 20 69 66 28 20 69 4e 65 77 45 6e 64 20 3c  .  if( iNewEnd <
37e90 20 69 4f 6c 64 45 6e 64 20 29 7b 0a 20 20 20 20   iOldEnd ){.    
37ea0 6e 43 65 6c 6c 20 2d 3d 20 70 61 67 65 46 72 65  nCell -= pageFre
37eb0 65 41 72 72 61 79 28 70 50 67 2c 20 69 4e 65 77  eArray(pPg, iNew
37ec0 45 6e 64 2c 20 69 4f 6c 64 45 6e 64 20 2d 20 69  End, iOldEnd - i
37ed0 4e 65 77 45 6e 64 2c 20 70 43 41 72 72 61 79 29  NewEnd, pCArray)
37ee0 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61 20 3d  ;.  }..  pData =
37ef0 20 26 61 44 61 74 61 5b 67 65 74 32 62 79 74 65   &aData[get2byte
37f00 4e 6f 74 5a 65 72 6f 28 26 61 44 61 74 61 5b 68  NotZero(&aData[h
37f10 64 72 2b 35 5d 29 5d 3b 0a 20 20 69 66 28 20 70  dr+5])];.  if( p
37f20 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 67 6f  Data<pBegin ) go
37f30 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
37f40 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 63 65 6c 6c  ;..  /* Add cell
37f50 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
37f60 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
37f70 69 66 28 20 69 4e 65 77 3c 69 4f 6c 64 20 29 7b  if( iNew<iOld ){
37f80 0a 20 20 20 20 69 6e 74 20 6e 41 64 64 20 3d 20  .    int nAdd = 
37f90 4d 49 4e 28 6e 4e 65 77 2c 69 4f 6c 64 2d 69 4e  MIN(nNew,iOld-iN
37fa0 65 77 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ew);.    assert(
37fb0 20 28 69 4f 6c 64 2d 69 4e 65 77 29 3c 6e 4e 65   (iOld-iNew)<nNe
37fc0 77 20 7c 7c 20 6e 43 65 6c 6c 3d 3d 30 20 7c 7c  w || nCell==0 ||
37fd0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
37fe0 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 70 50     pCellptr = pP
37ff0 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 20  g->aCellIdx;.   
38000 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70   memmove(&pCellp
38010 74 72 5b 6e 41 64 64 2a 32 5d 2c 20 70 43 65 6c  tr[nAdd*2], pCel
38020 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a  lptr, nCell*2);.
38030 20 20 20 20 69 66 28 20 70 61 67 65 49 6e 73 65      if( pageInse
38040 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20  rtArray(.       
38050 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20     pPg, pBegin, 
38060 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72  &pData, pCellptr
38070 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ,.          iNew
38080 2c 20 6e 41 64 64 2c 20 70 43 41 72 72 61 79 0a  , nAdd, pCArray.
38090 20 20 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69      ) ) goto edi
380a0 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20  tpage_fail;.    
380b0 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64 64 3b 0a 20  nCell += nAdd;. 
380c0 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6e 79   }..  /* Add any
380d0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
380e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
380f0 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20  pPg->nOverflow; 
38100 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
38110 65 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b 20 70 50  ell = (iOld + pP
38120 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d 29 20 2d 20  g->aiOvfl[i]) - 
38130 69 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 43  iNew;.    if( iC
38140 65 6c 6c 3e 3d 30 20 26 26 20 69 43 65 6c 6c 3c  ell>=0 && iCell<
38150 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 43  nNew ){.      pC
38160 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61  ellptr = &pPg->a
38170 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c 20 2a 20  CellIdx[iCell * 
38180 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  2];.      memmov
38190 65 28 26 70 43 65 6c 6c 70 74 72 5b 32 5d 2c 20  e(&pCellptr[2], 
381a0 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43 65 6c 6c  pCellptr, (nCell
381b0 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32 29 3b 0a   - iCell) * 2);.
381c0 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
381d0 20 20 20 20 20 69 66 28 20 70 61 67 65 49 6e 73       if( pageIns
381e0 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20  ertArray(.      
381f0 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69        pPg, pBegi
38200 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c  n, &pData, pCell
38210 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ptr,.           
38220 20 69 43 65 6c 6c 2b 69 4e 65 77 2c 20 31 2c 20   iCell+iNew, 1, 
38230 70 43 41 72 72 61 79 0a 20 20 20 20 20 20 29 20  pCArray.      ) 
38240 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
38250 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fail;.    }.  }.
38260 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c  .  /* Append cel
38270 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ls to the end of
38280 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70   the page */.  p
38290 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e  Cellptr = &pPg->
382a0 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32  aCellIdx[nCell*2
382b0 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73  ];.  if( pageIns
382c0 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20  ertArray(.      
382d0 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26    pPg, pBegin, &
382e0 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c  pData, pCellptr,
382f0 0a 20 20 20 20 20 20 20 20 69 4e 65 77 2b 6e 43  .        iNew+nC
38300 65 6c 6c 2c 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c  ell, nNew-nCell,
38310 20 70 43 41 72 72 61 79 0a 20 20 29 20 29 20 67   pCArray.  ) ) g
38320 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69  oto editpage_fai
38330 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c  l;..  pPg->nCell
38340 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d 3e   = nNew;.  pPg->
38350 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
38360 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
38370 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
38380 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
38390 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
383a0 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
383b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
383c0 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
383d0 20 69 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52 52   i<nNew && !CORR
383e0 55 50 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20 20  UPT_DB; i++){.  
383f0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43    u8 *pCell = pC
38400 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 2b  Array->apCell[i+
38410 69 4e 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69  iNew];.    int i
38420 4f 66 66 20 3d 20 67 65 74 32 62 79 74 65 41 6c  Off = get2byteAl
38430 69 67 6e 65 64 28 26 70 50 67 2d 3e 61 43 65 6c  igned(&pPg->aCel
38440 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20 20  lIdx[i*2]);.    
38450 69 66 28 20 70 43 65 6c 6c