/ Hex Artifact Content
Login

Artifact 546be5b4244b5bc0d9e5a25706db5c1a3c682400:


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 6e 64 65 66  E_OK;.}..#ifndef
6ed0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6ee0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
6ef0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6f00: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6f10: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6f20: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6f30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6f40: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6f50: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6f60: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6f70: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6f80: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6f90: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
6fa0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
6fb0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
6fc0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
6fd0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
6fe0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
6ff0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7000: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7010: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7020: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7030: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7040: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7050: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7060: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7070: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7080: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7090: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
70a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
70b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
70c0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
70d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
70e0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
70f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7100: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7110: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7120: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7130: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7140: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7150: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7160: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7170: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7180: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7190: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
71a0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
71b0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
71c0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
71d0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
71e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
71f0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7200: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7210: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7220: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7230: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7240: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7250: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7260: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7270: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7280: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7290: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
72a0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
72b0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
72c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
72d0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
72e0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
72f0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
7300: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7310: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7320: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7330: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7340: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7350: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7360: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7370: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7380: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7390: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
73a0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
73b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
73c0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
73d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
73e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
73f0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7400: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7410: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7420: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7430: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7440: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7450: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7460: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7470: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7480: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7490: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
74a0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
74b0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
74c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
74d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
74e0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
74f0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7500: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7510: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7520: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7530: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7540: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7550: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7560: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7570: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7580: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7590: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
75a0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
75b0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
75c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
75d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
75e0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
75f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7600: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7610: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7620: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7630: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7640: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7650: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7660: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7670: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7680: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7690: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
76a0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
76b0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
76c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
76d0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
76e0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
76f0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7700: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7710: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7720: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7730: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7740: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7750: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7760: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7770: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7780: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77a0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
77b0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
77c0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
77d0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
77e0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
77f0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7800: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7810: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7820: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7830: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7840: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7850: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7860: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7870: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7880: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7890: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
78a0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
78b0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
78c0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
78d0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
78e0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
78f0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7900: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7910: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7920: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7930: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7940: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7950: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7960: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7970: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7980: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7990: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
79a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
79b0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
79c0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
79d0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
79e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
79f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
7a00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
7a10: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7a20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
7a30: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
7a40: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
7a50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7a60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7a70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
7a80: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7a90: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7aa0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7ab0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7ac0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
7ad0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
7ae0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
7af0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
7b00: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
7b10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7b20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
7b30: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
7b40: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
7b50: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
7b60: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
7b70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7b80: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
7b90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7ba0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
7bb0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
7bc0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
7bd0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
7be0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
7bf0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
7c00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
7c10: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
7c20: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
7c30: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7c40: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
7c50: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7c60: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
7c70: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
7c80: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
7c90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7ca0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7cb0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
7cc0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
7cd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7ce0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
7cf0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7d00: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7d10: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7d20: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7d30: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7d40: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7d50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7d60: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7d70: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7d80: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
7d90: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
7da0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
7db0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
7dc0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
7dd0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
7de0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
7df0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7e00: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
7e10: 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  () does the same
7e20: 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73   except it skips
7e30: 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61   past the initia
7e40: 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c  l.** 4-byte chil
7e50: 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20  d pointer found 
7e60: 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  on interior page
7e70: 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  s, if there is o
7e80: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
7e90: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
7ea0: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
7eb0: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
7ec0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
7ed0: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
7ee0: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
7ef0: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
7f00: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
7f10: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
7f20: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
7f30: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
7f40: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49  dCellPastPtr(P,I
7f50: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
7f60: 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61  aOfst + ((P)->ma
7f70: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
7f80: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
7f90: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
7fa0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ).../*.** This i
7fb0: 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72  s common tail pr
7fc0: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72  ocessing for btr
7fd0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
7fe0: 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72   and.** btreePar
7ff0: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8000: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
8010: 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73  en the cell does
8020: 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c   not fit entirel
8030: 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65  y.** on a single
8040: 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d   B-tree page.  M
8050: 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  ake necessary ad
8060: 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65  justments to the
8070: 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72   CellInfo.** str
8080: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
8090: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
80a0: 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  E void btreePars
80b0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
80c0: 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65  orOverflow(.  Me
80d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
80e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
80f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
8100: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
8110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8120: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
8130: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
8140: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
8150: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
8160: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
8170: 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  re */.){.  /* If
8180: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8190: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
81a0: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
81b0: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
81c0: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
81d0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
81e0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
81f0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
8200: 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  nto.  ** overflo
8210: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
8220: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
8230: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
8240: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20   of unused.  ** 
8250: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
8260: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
8270: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
8280: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
8290: 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65  e.  ** in betwee
82a0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
82b0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  axLocal..  **.  
82c0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
82d0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
82e0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
82f0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
8300: 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69   any.  ** way wi
8310: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
8320: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
8330: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20  e format..  */. 
8340: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
8350: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
8360: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8370: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
8380: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
8390: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
83a0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
83b0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
83c0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
83d0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
83e0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
83f0: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
8400: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8410: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8420: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
8430: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75  ->maxLocal;.  su
8440: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
8450: 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   + (pInfo->nPayl
8460: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
8470: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8480: 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65  bleSize-4);.  te
8490: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
84a0: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  =maxLocal );.  t
84b0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
84c0: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
84d0: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
84e0: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
84f0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8500: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
8510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
8520: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8530: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  )minLocal;.  }. 
8540: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
8550: 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  w = (u16)(&pInfo
8560: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8570: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8580: 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  l);.  pInfo->nSi
8590: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
85a0: 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  rflow + 4;.}../*
85b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
85c0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
85d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
85e0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
85f0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
8600: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
8610: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8620: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8630: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8640: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8650: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8660: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8670: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8680: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8690: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
86a0: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
86b0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
86c0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
86d0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
86e0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
86f0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
8700: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
8710: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
8720: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
8730: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
8740: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
8750: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8760: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8770: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8780: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8790: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
87a0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
87b0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
87c0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
87d0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
87e0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
87f0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8800: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8810: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8820: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8830: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8840: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8850: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8860: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8870: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8880: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8890: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
88a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
88b0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
88c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
88d0: 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61  noPayload );.  a
88e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
88f0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8910: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
8920: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
8930: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
8940: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8950: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8960: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8970: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
8980: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
8990: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
89a0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  0;.  pInfo->iOve
89b0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49 6e  rflow = 0;.  pIn
89c0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
89d0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
89e0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
89f0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
8a00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
8a10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
8a20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
8a30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
8a40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8a50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
8a60: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
8a70: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8a80: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8a90: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8aa0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
8ab0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
8ac0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
8ad0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
8ae0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
8af0: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
8b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8b10: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
8b20: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b40: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
8b50: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
8b60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8b70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8b80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
8b90: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
8ba0: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
8bb0: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
8bc0: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
8bd0: 65 79 4c 65 61 66 20 7c 7c 20 70 50 61 67 65 2d  eyLeaf || pPage-
8be0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  >noPayload );.  
8bf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8c00: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
8c10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8c20: 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20  intKeyLeaf );.  
8c30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
8c40: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29  hildPtrSize==0 )
8c50: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
8c60: 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  l;..  /* The nex
8c70: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
8c80: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
8c90: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
8ca0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
8cb0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79  nt32(pIter, nPay
8cc0: 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  load);.  **.  **
8cd0: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
8ce0: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
8cf0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
8d00: 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
8d10: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
8d20: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
8d30: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
8d40: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
8d50: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
8d60: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
8d70: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
8d80: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
8d90: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
8da0: 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72   }while( (*pIter
8db0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
8dc0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
8dd0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  Iter++;..  /* Th
8de0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
8df0: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
8e00: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
8e10: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
8e20: 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28  tVarint(pIter, (
8e30: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
8e40: 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  y);.  **.  ** Th
8e50: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
8e60: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
8e70: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
8e80: 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72  .  iKey = *pIter
8e90: 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78  ;.  if( iKey>=0x
8ea0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
8eb0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a  nd = &pIter[7];.
8ec0: 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66      iKey &= 0x7f
8ed0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a  ;.    while(1){.
8ee0: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
8ef0: 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ey<<7) | (*++pIt
8f00: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f10: 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30    if( (*pIter)<0
8f20: 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  x80 ) break;.   
8f30: 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45     if( pIter>=pE
8f40: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b  nd ){.        iK
8f50: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c  ey = (iKey<<8) |
8f60: 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20   *++pIter;.     
8f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  }.    }.  }.  pI
8f90: 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ter++;..  pInfo-
8fa0: 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26  >nKey = *(i64*)&
8fb0: 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  iKey;.  pInfo->n
8fc0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
8fd0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
8fe0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
8ff0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9000: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9010: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9020: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9030: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9040: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9050: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9060: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9070: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9080: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9090: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
90a0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
90b0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
90c0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
90d0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
90e0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
90f0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9100: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9110: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9120: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9130: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9140: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9150: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9160: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
9170: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
9180: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
9190: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
91a0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
91b0: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
91c0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
91d0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
91e0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
91f0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9200: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9210: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9220: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9230: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9240: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9250: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9260: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9270: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
9280: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
9290: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
92a0: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
92b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
92c0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
92d0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
92e0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
92f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9300: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9310: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
9320: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9330: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9340: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9350: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9360: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
9370: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
9380: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9390: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
93a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
93b0: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
93c0: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
93d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
93e0: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
93f0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9400: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
9410: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9420: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9430: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9440: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9450: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
9460: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9470: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9480: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
9490: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
94a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
94b0: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
94c0: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
94d0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
94e0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
94f0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9500: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9510: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9520: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9530: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9540: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9550: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9560: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9570: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9580: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9590: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
95a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
95b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
95c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
95d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
95e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
95f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9600: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9610: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9620: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9630: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9640: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9650: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9660: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9670: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9680: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
9690: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
96a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
96b0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
96c0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
96d0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
96e0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
96f0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9700: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9710: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9720: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9730: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9740: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9760: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9770: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9780: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9790: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
97a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
97b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
97c0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
97d0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
97e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
97f0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9800: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9810: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9820: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9830: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9840: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9850: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9860: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9870: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9880: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9890: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
98a0: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
98b0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
98c0: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
98d0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
98e0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
98f0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9900: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9910: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9920: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9930: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9940: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9950: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9960: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9970: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9980: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
9990: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
99a0: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
99b0: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
99c0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
99d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
99e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
99f0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
9a00: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9a10: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9a20: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
9a30: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
9a40: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
9a50: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
9a80: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
9a90: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9ac0: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
9ad0: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
9ae0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
9af0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
9b00: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
9b10: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
9b20: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
9b30: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
9b40: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
9b50: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
9b60: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
9b70: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
9b80: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
9b90: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
9ba0: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
9bb0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
9bc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
9bd0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
9be0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
9bf0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
9c00: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
9c10: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
9c20: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
9c30: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
9c40: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
9c50: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
9c60: 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 6e 53 69  load==0 );.  nSi
9c70: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
9c80: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
9c90: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
9ca0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
9cb0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
9cc0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
9cd0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
9ce0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9cf0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9d00: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9d10: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9d20: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
9d30: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
9d40: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
9d50: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
9d60: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
9d70: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
9d80: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
9d90: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
9da0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
9db0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
9dc0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
9dd0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
9de0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
9df0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
9e00: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
9e10: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
9e20: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
9e30: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9e40: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
9e50: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
9e60: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9e70: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
9e80: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9e90: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
9ea0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
9eb0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
9ec0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
9ed0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9ee0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9ef0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9f00: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9f10: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9f20: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9f30: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9f40: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9f50: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9f60: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
9f70: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
9f80: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9f90: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
9fa0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9fb0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9fc0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
9fd0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9fe0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9ff0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
a000: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
a010: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a020: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
a030: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
a040: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
a050: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
a060: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
a070: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
a080: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a090: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
a0a0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a0b0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a0c0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
a0d0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a0e0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a0f0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a100: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
a110: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
a120: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a130: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a140: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a150: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a160: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a170: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a180: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a190: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a1a0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a1b0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a1c0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a1d0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a1e0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a1f0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a200: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a210: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a220: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a230: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a240: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a250: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a260: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a270: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a280: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a290: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
a2a0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
a2b0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
a2c0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a2d0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
a2e0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
a2f0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a300: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a310: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
a320: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
a330: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
a340: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
a350: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
a360: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
a370: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
a380: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a390: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
a3a0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
a3b0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
a3c0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
a3d0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
a3e0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
a3f0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
a400: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
a410: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
a420: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
a430: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
a440: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
a450: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
a460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a470: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
a480: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
a490: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
a4a0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
a4b0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
a4c0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
a4d0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
a4e0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
a4f0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
a500: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
a510: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
a520: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
a530: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a540: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
a550: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
a560: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
a570: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
a580: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
a590: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
a5a0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
a5b0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
a5c0: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
a5d0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
a5e0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
a5f0: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
a600: 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  w]);.    ptrmapP
a610: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
a620: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
a630: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
a640: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
a650: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
a660: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
a670: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
a680: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
a690: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
a6a0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
a6b0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
a6c0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
a6d0: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
a6e0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
a6f0: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
a700: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
a710: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
a720: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a730: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
a740: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
a750: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
a760: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
a770: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
a780: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
a790: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
a7a0: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
a7b0: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
a7c0: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
a7d0: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
a7e0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
a7f0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
a800: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
a810: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
a820: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
a830: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
a840: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
a850: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
a860: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
a870: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a890: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
a8a0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
a8d0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
a8e0: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
a8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
a900: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
a910: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
a920: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a930: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a940: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
a950: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
a960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a970: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
a980: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
a990: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
a9a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
a9b0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
a9c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a9d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
aa00: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
aa10: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
aa20: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
aa30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aa40: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
aa50: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
aa60: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
aa70: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
aa80: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
aa90: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
aaa0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
aab0: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
aac0: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
aad0: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
aae0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
aaf0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
ab00: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
ab10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
ab20: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
ab30: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
ab40: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
ab50: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
ab60: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
ab70: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
ab80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
ab90: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
aba0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
abb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
abc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
abd0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
abe0: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
abf0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
ac00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ac10: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
ac20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ac30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ac40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
ac50: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
ac60: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
ac70: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
ac80: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
ac90: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
aca0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
acb0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
acc0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
acd0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
ace0: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
acf0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
ad00: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
ad10: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ad20: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
ad30: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
ad40: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
ad50: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
ad60: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
ad70: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
ad80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
ad90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
ada0: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
adb0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
adc0: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
add0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
ade0: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
adf0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
ae00: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
ae10: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
ae20: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
ae30: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
ae40: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
ae50: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
ae60: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
ae70: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
ae80: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
ae90: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
aea0: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
aeb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
aec0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
aed0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
aee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
aef0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
af00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
af10: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
af20: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
af30: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
af40: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
af50: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
af60: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
af70: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
af80: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
af90: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
afa0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
afb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
afc0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
afd0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
afe0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
aff0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b000: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b010: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b020: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b030: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b040: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b050: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b060: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b070: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b080: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b090: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b0a0: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b0b0: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b0c0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b0d0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b0e0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b0f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b100: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b110: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b120: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b130: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b140: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b150: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b160: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b170: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b180: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b190: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b1a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b1b0: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b1c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b1d0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b1e0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b1f0: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b200: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b210: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b220: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b230: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b240: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b250: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b260: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b270: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b280: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b290: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b2a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b2b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b2c0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b2d0: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b2e0: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b2f0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b300: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b310: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b320: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b330: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b340: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b350: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b360: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b370: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b380: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
b390: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
b3a0: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
b3b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
b3c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
b3d0: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
b3e0: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
b3f0: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
b400: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
b410: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
b420: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
b430: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
b440: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
b450: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
b460: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
b470: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
b480: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
b490: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
b4a0: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
b4b0: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
b4c0: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
b4d0: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
b4e0: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
b4f0: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
b500: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
b510: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
b520: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
b530: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
b540: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
b550: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
b560: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
b570: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
b580: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
b590: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
b5a0: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
b5b0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
b5c0: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
b5d0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
b5e0: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
b5f0: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
b600: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
b610: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
b620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b630: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
b640: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
b650: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
b660: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
b670: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
b680: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
b690: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
b6a0: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
b6b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
b6c0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
b6d0: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
b6e0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
b6f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b700: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b710: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
b720: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
b730: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
b740: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
b750: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
b760: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
b770: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
b780: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b790: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
b7a0: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
b7b0: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
b7c0: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
b7d0: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
b7e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
b7f0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
b800: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
b810: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
b820: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
b830: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b840: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
b850: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
b860: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
b870: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
b880: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
b890: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
b8a0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
b8b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
b8c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
b8d0: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
b8e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
b8f0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
b900: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
b910: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
b920: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
b930: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
b940: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
b950: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
b960: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
b970: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
b980: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
b990: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
b9a0: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
b9b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
b9c0: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
b9d0: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
b9e0: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
b9f0: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
ba00: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
ba10: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
ba20: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
ba30: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
ba40: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
ba50: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
ba60: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
ba70: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
ba80: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
ba90: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
baa0: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
bab0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
bac0: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
bad0: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
bae0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
baf0: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
bb00: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
bb10: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
bb20: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
bb30: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
bb40: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
bb50: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
bb60: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
bb70: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
bb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
bb90: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
bba0: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
bbb0: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
bbc0: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
bbd0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
bbe0: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
bbf0: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
bc00: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
bc10: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
bc20: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
bc30: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
bc40: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
bc50: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
bc60: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
bc70: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
bc80: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
bc90: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
bca0: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
bcb0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
bcc0: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
bcd0: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
bce0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
bcf0: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
bd00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
bd10: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
bd20: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
bd30: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
bd40: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
bd50: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
bd60: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
bd70: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
bd80: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
bd90: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
bda0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
bdb0: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
bdc0: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
bdd0: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
bde0: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
bdf0: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
be00: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
be10: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
be20: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
be30: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
be40: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
be50: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
be60: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
be70: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
be80: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
be90: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
bea0: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
beb0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
bec0: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
bed0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
bee0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
bef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf10: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
bf20: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
bf30: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bf40: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bf50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bf60: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
bf70: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
bf80: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bf90: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
bfa0: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
bfb0: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
bfc0: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
bfd0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
bfe0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
bff0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c000: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c010: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c020: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c030: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c040: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c050: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c060: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c070: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c080: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c090: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c0a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c0b0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c0c0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c0d0: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c0e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c0f0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c100: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c110: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c120: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c130: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c140: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c150: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c160: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c170: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c180: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c190: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c1a0: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c1b0: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c1c0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c1d0: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c1e0: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c1f0: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c200: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c210: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c220: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c230: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c240: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c250: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c260: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c270: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c280: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c290: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c2a0: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c2b0: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c2c0: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c2d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c2e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c2f0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c300: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c310: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c320: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c330: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c340: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c350: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c360: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c370: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c380: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
c390: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
c3a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c3b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c3c0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
c3d0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
c3e0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
c3f0: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
c400: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
c410: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
c420: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
c430: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
c440: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
c450: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
c460: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
c470: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
c480: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
c490: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
c4a0: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
c4b0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
c4c0: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
c4d0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
c4e0: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
c4f0: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
c500: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
c510: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
c520: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
c530: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
c540: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
c550: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
c560: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
c570: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
c580: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
c590: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
c5a0: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
c5b0: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
c5c0: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
c5d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c5e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
c5f0: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
c600: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
c610: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c620: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
c630: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
c640: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
c650: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
c660: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
c670: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
c680: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
c690: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
c6a0: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
c6b0: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
c6c0: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
c6d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c6e0: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
c6f0: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
c700: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
c710: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
c720: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c730: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
c740: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
c750: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
c760: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
c770: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
c780: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
c790: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
c7a0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
c7b0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
c7c0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
c7d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
c7e0: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
c7f0: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
c800: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
c810: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
c820: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
c830: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c840: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
c850: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
c860: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
c870: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
c880: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
c890: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
c8a0: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
c8b0: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
c8c0: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
c8d0: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
c8e0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
c8f0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
c900: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
c910: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
c920: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c930: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
c940: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
c950: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c960: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
c970: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
c980: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
c990: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
c9a0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c9b0: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
c9c0: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
c9d0: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
c9e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
c9f0: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
ca00: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
ca10: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
ca20: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
ca30: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
ca40: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
ca50: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
ca60: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
ca70: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
ca80: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
ca90: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
caa0: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
cab0: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
cac0: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
cad0: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
cae0: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
caf0: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
cb00: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
cb10: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
cb20: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
cb30: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
cb40: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
cb50: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
cb60: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
cb70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cb80: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
cb90: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
cba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
cbb0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
cbc0: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
cbd0: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
cbe0: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
cc10: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
cc20: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
cc30: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
cc60: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
cc70: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
cc80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
ccb0: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
ccc0: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
ccd0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
cce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ccf0: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
cd00: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
cd10: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
cd20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
cd30: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
cd40: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
cd50: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
cd60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
cd70: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
cd80: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
cd90: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
cda0: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
cdb0: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
cdc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
cdd0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
cde0: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
cdf0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
ce00: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ce10: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
ce20: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
ce30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
ce40: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
ce50: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
ce60: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
ce70: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
ce80: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
ce90: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
cea0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
ceb0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
cec0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
ced0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
cee0: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
cef0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
cf00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cf10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cf20: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
cf30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
cf40: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
cf50: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
cf60: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
cf70: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
cf80: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
cf90: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
cfa0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
cfb0: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
cfc0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
cfd0: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
cfe0: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
cff0: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d000: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d010: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d020: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d030: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d040: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d050: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d060: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d070: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d080: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d090: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d0a0: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d0b0: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d0c0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d0d0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d0e0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d0f0: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d100: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d110: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d120: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d130: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d140: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d150: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d170: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d180: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d190: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
d1a0: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
d1b0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
d1c0: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
d1d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d1e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
d1f0: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
d200: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
d210: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
d220: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d230: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
d240: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
d250: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
d260: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
d270: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
d280: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
d290: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
d2a0: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
d2b0: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
d2c0: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
d2d0: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
d2e0: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
d2f0: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
d300: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
d310: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
d320: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
d330: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
d340: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
d350: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
d360: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
d370: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
d380: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
d390: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
d3a0: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
d3b0: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
d3c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d3d0: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
d3e0: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
d3f0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
d400: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
d410: 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
d420: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d430: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d440: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d450: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
d460: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
d470: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
d480: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
d490: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
d4a0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
d4b0: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
d4c0: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
d4d0: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
d4e0: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
d4f0: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
d500: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
d510: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
d520: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
d530: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
d540: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
d550: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
d560: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
d570: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
d580: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
d590: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
d5a0: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
d5b0: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
d5c0: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
d5d0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
d5e0: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
d5f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d600: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
d610: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
d620: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
d630: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
d640: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
d650: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
d660: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
d670: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
d680: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
d690: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d6a0: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
d6b0: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
d6c0: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
d6d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d6e0: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
d6f0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
d700: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
d710: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
d720: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
d730: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
d740: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
d750: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
d760: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
d770: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
d780: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
d790: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
d7a0: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
d7b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
d7c0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
d7d0: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
d7e0: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
d7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
d800: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
d810: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
d820: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
d830: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
d840: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
d850: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
d860: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
d870: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
d880: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
d890: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
d8a0: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
d8b0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
d8c0: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
d8d0: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
d8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d8f0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
d900: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
d910: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d920: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
d930: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
d940: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
d950: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
d960: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
d970: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
d980: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
d990: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
d9a0: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
d9b0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
d9c0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
d9d0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
d9e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
d9f0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
da00: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
da10: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
da20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
da30: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
da40: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
da50: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
da60: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
da70: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
da80: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
da90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
daa0: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
dab0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
dac0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
dad0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
dae0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
daf0: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
db00: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
db10: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
db20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
db30: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
db40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
db50: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
db60: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
db70: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
db80: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
db90: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
dba0: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
dbb0: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
dbc0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
dbd0: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
dbe0: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
dbf0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
dc00: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
dc10: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
dc20: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
dc30: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
dc40: 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d  NCE-OF: R-03640-
dc50: 31 33 34 31 35 20 41 20 76 61 6c 75 65 20 6f 66  13415 A value of
dc60: 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   5 means the pag
dc70: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
dc80: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d  .    ** table b-
dc90: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
dca0: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
dcb0: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
dcc0: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
dcd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dce0: 32 30 35 30 31 2d 36 31 37 39 36 20 41 20 76 61  20501-61796 A va
dcf0: 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e 73 20  lue of 13 means 
dd00: 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65  the page is a le
dd10: 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  af.    ** table 
dd20: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
dd30: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
dd40: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
dd50: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  TKEY|PTF_LEAF)==
dd60: 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  13 );.    pPage-
dd70: 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
dd80: 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
dd90: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   ){.      pPage-
dda0: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b  >intKeyLeaf = 1;
ddb0: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  .      pPage->no
ddc0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
ddd0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
dde0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
ddf0: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
de00: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
de10: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
de20: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ;.      pPage->n
de30: 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b 0a 20 20  oPayload = 1;.  
de40: 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
de50: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
de60: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
de70: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
de80: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
de90: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
dea0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
deb0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
dec0: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
ded0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
dee0: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
def0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
df00: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
df10: 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
df20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32  IDENCE-OF: R-272
df30: 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65  25-53936 A value
df40: 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20   of 2 means the 
df50: 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72  page is an inter
df60: 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ior.    ** index
df70: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
df80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
df90: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
dfa0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
dfb0: 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31  E-OF: R-16571-11
dfc0: 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31  615 A value of 1
dfd0: 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  0 means the page
dfe0: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
dff0: 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  * index b-tree p
e000: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e010: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e020: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e030: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e040: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e050: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e060: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e070: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  noPayload = 0;. 
e080: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
e090: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
e0a0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
e0b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
e0c0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
e0d0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
e0e0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
e0f0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
e100: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e110: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
e120: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
e130: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
e140: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
e150: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
e160: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
e170: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e180: 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  PT;.  }.  pPage-
e190: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
e1a0: 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
e1b0: 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
e1c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e1d0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
e1e0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
e1f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
e200: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
e210: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
e220: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e230: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
e240: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
e250: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
e260: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
e270: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
e280: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
e290: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
e2a0: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
e2b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
e2c0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
e2d0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
e2e0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
e2f0: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
e300: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
e310: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
e320: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
e330: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
e340: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
e350: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
e360: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e370: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e380: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
e390: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e3a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e3b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e3c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
e3d0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
e3e0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
e3f0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
e400: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
e410: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
e420: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
e430: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e450: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
e460: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
e470: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e480: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
e490: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
e4a0: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
e4b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e4c0: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
e4d0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
e4e0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e500: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
e510: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
e520: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
e530: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
e540: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
e550: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
e560: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
e570: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
e580: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e590: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
e5a0: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
e5b0: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
e5c0: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
e5d0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
e5e0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
e5f0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
e600: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
e610: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
e620: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
e630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e640: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
e650: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
e660: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
e670: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
e680: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
e690: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
e6a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
e6b0: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
e6c0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
e6d0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
e6e0: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
e6f0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
e700: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
e710: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
e720: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
e730: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e740: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
e750: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
e760: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
e770: 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56  aData;.    /* EV
e780: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35  IDENCE-OF: R-285
e790: 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65  94-02890 The one
e7a0: 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66  -byte flag at of
e7b0: 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e  fset 0 indicatin
e7c0: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74  g.    ** the b-t
e7d0: 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a  ree page type. *
e7e0: 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  /.    if( decode
e7f0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
e800: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
e810: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e820: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
e830: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
e840: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
e850: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
e860: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
e870: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
e880: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
e890: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
e8a0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
e8b0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
e8c0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
e8d0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
e8e0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
e8f0: 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
e900: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
e910: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
e920: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
e930: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
e940: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
e950: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
e960: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
e970: 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
e980: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e990: 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ze];.    /* EVID
e9a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35  ENCE-OF: R-58015
e9b0: 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62  -48175 The two-b
e9c0: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
e9d0: 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74  ffset 5 designat
e9e0: 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  es.    ** the st
e9f0: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  art of the cell 
ea00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20  content area. A 
ea10: 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74  zero value for t
ea20: 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20  his integer is. 
ea30: 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65     ** interprete
ea40: 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
ea50: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
ea60: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
ea70: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45  dr+5]);.    /* E
ea80: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
ea90: 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
eaa0: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
eab0: 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
eac0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
ead0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
eae0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
eaf0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
eb00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eb10: 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  r+3]);.    if( p
eb20: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
eb30: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
eb40: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
eb50: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
eb60: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
eb70: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
eb80: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
eb90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
eba0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  KPT;.    }.    t
ebb0: 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
ebc0: 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
ebd0: 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  Bt) );.    /* EV
ebe0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
ebf0: 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
ec00: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
ec10: 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
ec20: 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69  nly.    ** possi
ec30: 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70  ble for a root p
ec40: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74  age of a table t
ec50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  hat contains no 
ec60: 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20  rows) then the. 
ec70: 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20     ** offset to 
ec80: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ec90: 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c   area will equal
eca0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   the page size m
ecb0: 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  inus the.    ** 
ecc0: 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
ecd0: 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  d space. */.    
ece0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ecf0: 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
ed00: 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
ed10: 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20  RUPT_DB );..    
ed20: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
ed30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
ed40: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
ed50: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
ed60: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
ed70: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
ed80: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
ed90: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
eda0: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
edb0: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
edc0: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
edd0: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
ede0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
edf0: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
ee00: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
ee10: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
ee20: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
ee30: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
ee40: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
ee50: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
ee60: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
ee70: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
ee80: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
ee90: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d      if( pBt->db-
eea0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
eeb0: 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
eec0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
eed0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
eee0: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
eef0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
ef00: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
ef10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ef20: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
ef30: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ef40: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
ef50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ef60: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
ef70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
ef80: 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
ef90: 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
efa0: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
efb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
efc0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
efd0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
efe0: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
eff0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f000: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f010: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f020: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f030: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f040: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
f050: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61          sz = pPa
f060: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
f070: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
f080: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f090: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
f0a0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
f0b0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
f0c0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
f0d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f0e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f100: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
f110: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
f120: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20  st++;.    }  .. 
f130: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
f140: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
f150: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  ce on the page. 
f160: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
f170: 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
f180: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
f190: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
f1a0: 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  1 gives the.    
f1b0: 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
f1c0: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
f1d0: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
f1e0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
f1f0: 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66   are no.    ** f
f200: 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20  reeblocks. */.  
f210: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
f220: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
f230: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
f240: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
f250: 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
f260: 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
f270: 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ee space */.    
f280: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
f290: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
f2a0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
f2b0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f2c0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f2d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
f2e0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
f2f0: 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
f300: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
f310: 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
f320: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
f330: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
f340: 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
f350: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
f360: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
f370: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20       ** Or, the 
f380: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66  freeblock is off
f390: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f3a0: 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  page.        */.
f3b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f3c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f3d0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
f3e0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
f3f0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
f400: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
f410: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
f420: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
f430: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
f440: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
f450: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
f460: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
f470: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
f480: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f490: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
f4a0: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
f4b0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
f4c0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
f4d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
f4e0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
f4f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f500: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
f510: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
f520: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
f530: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
f540: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
f550: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
f560: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
f570: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
f580: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
f590: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
f5a0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
f5b0: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
f5c0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
f5d0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
f5e0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
f5f0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
f600: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
f610: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
f620: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
f630: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
f640: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
f650: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
f660: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
f670: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
f680: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
f690: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
f6a0: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
f6b0: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
f6c0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
f6d0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
f6e0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
f6f0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
f700: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f720: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f730: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
f740: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
f750: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
f760: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
f770: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
f780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f790: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
f7a0: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
f7b0: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
f7c0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
f7d0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
f7e0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
f7f0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
f800: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
f810: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
f820: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f830: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
f840: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
f850: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
f860: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
f870: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
f880: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
f890: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f8a0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
f8b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f8c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
f8d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f8e0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
f8f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
f900: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
f910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f930: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
f940: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
f950: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
f960: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
f970: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
f980: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f990: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
f9a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
f9b0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
f9c0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
f9d0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
f9e0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
f9f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
fa00: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
fa10: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
fa20: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
fa30: 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
fa40: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
fa50: 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
fa60: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
fa70: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
fa80: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
fa90: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
faa0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fab0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
fac0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
fad0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
fae0: 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
faf0: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
fb00: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
fb10: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
fb20: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
fb30: 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
fb40: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
fb50: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
fb60: 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
fb70: 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
fb80: 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
fb90: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
fba0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
fbb0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
fbc0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
fbd0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
fbe0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
fbf0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
fc00: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
fc10: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
fc20: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
fc30: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
fc40: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
fc50: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
fc60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
fc70: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
fc80: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
fc90: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
fca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
fcb0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
fcc0: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
fcd0: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
fce0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
fcf0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
fd00: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
fd10: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
fd20: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
fd30: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
fd40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
fd50: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
fd60: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
fd70: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
fd80: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
fd90: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
fda0: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
fdb0: 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
fdc0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
fdd0: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
fde0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
fdf0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
fe00: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
fe10: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
fe20: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
fe30: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
fe40: 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
fe50: 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
fe60: 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
fe70: 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
fe80: 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
fe90: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
fea0: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
feb0: 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
fec0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
fed0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
fee0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
fef0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
ff00: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
ff10: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
ff20: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
ff30: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
ff40: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
ff50: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
ff60: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
ff70: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
ff80: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
ff90: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
ffa0: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
ffb0: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
ffc0: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
ffd0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
ffe0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
fff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10000 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
10010 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10020 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
10030 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10050 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
10060 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
10070 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10080 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
10090 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
100a0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
100b0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
100c0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
100d0 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
100e0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
100f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
10100 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10110 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
10120 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
10130 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10140 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
10150 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
10160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10170 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10180 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
101a0 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
101b0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
101c0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
101d0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
101e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
101f0 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10200 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10210 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10220 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10240 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10250 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10260 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10270 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10280 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
10290 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
102a0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
102b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
102c0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
102d0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
102e0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
102f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10300 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10310 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10320 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10330 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10340 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10360 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10370 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10380 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
10390 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
103a0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
103b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
103c0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
103d0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
103e0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
103f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10400 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10410 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10420 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10430 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10440 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10450 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10460 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10470 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10480 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
10490 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
104a0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
104b0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
104c0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
104d0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
104e0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
104f0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10500 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10510 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10520 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10530 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10540 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10550 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10560 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10570 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10580 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10590 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
105a0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
105b0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
105c0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
105d0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
105e0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
105f0 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10600 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10610 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10620 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10630 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10640 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10650 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10660 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10670 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10680 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10690 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
106a0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
106b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
106c0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
106d0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
106e0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
106f0 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10700 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10710 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10720 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10730 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10740 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10750 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10770 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10780 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
107b0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
107c0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
107d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
107e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
107f0 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10800 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10810 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10820 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10830 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10840 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10850 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10880 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10890 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
108a0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
108b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
108c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
108d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
108e0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
108f0 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10900 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10910 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10920 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10930 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10940 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10950 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10960 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10970 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10980 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10990 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
109a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
109b0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
109c0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
109d0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
109e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
109f0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
10a00 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10a10 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
10a20 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
10a30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
10a40 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
10a50 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
10a60 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
10a70 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
10a80 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 69 66  pgno, pBt);.  if
10a90 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
10aa0 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
10ab0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
10ac0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
10ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
10af0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
10b00 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
10b10 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
10b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10b30 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
10b40 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
10b50 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
10b60 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
10b70 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
10b80 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
10b90 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
10ba0 20 20 69 66 28 20 70 43 75 72 0a 20 20 20 26 26    if( pCur.   &&
10bb0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
10bc0 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
10bd0 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
10be0 3e 63 75 72 49 6e 74 4b 65 79 29 0a 20 20 29 7b  >curIntKey).  ){
10bf0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10c00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10c10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
10c20 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74  ppPage);.    got
10c30 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
10c40 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  _error;.  }.  re
10c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c60 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f  .getAndInitPage_
10c70 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75  error:.  if( pCu
10c80 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  r ) pCur->iPage-
10c90 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  -;.  testcase( p
10ca0 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
10cb0 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
10cc0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
10cd0 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
10ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
10cf0 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
10d00 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
10d10 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
10d20 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
10d30 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
10d40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10d50 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
10d60 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ull(MemPage *pPa
10d70 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
10d80 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
10d90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10da0 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
10db0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
10dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10dd0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10de0 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10df0 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
10e00 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
10e10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
10e20 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10e30 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
10e40 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
10e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10e60 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
10e70 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10e80 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
10e90 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
10ea0 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
10eb0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
10ec0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
10ed0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72  .  if( pPage ) r
10ee0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
10ef0 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  l(pPage);.}../*.
10f00 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64  ** Get an unused
10f10 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   page..**.** Thi
10f20 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
10f30 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  e btreeGetPage()
10f40 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
10f50 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49  on:.**.**   *  I
10f60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
10f70 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72  ready in use for
10f80 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
10f90 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79  ose, immediately
10fa0 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65  .**      release
10fb0 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61   it and return a
10fc0 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54  n SQLITE_CURRUPT
10fd0 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20   error..**   *  
10fe0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73  Make sure the is
10ff0 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65  Init flag is cle
11000 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ar.*/.static int
11010 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
11020 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11030 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
11040 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
11050 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11070 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
11080 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
11090 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
110a0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
110b0 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
110c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
110d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
110e0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
110f0 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
11100 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
11110 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65  int rc = btreeGe
11120 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
11130 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
11140 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
11160 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11170 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
11180 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
11190 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
111a0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
111b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
111c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
111d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
111e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
111f0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
11200 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11210 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
11220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11230 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  .../*.** During 
11240 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
11250 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
11260 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
11270 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
11280 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
11290 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
112a0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
112b0 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
112c0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
112d0 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
112e0 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
112f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11300 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
11310 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
11320 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
11330 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
11340 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
11350 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
11360 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
11370 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
11380 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
11390 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
113a0 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
113b0 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
113c0 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
113d0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
113e0 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
113f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11400 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
11410 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
11420 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
11430 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11440 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11450 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11460 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
11470 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
11480 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
11490 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
114a0 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
114b0 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
114c0 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
114d0 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
114e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
114f0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
11500 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
11510 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
11520 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
11530 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
11540 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
11550 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
11560 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
11570 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
11580 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
11590 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
115a0 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
115b0 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
115c0 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
115d0 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
115e0 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
115f0 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
11600 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
11610 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
11620 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
11630 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
11640 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
11650 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
11660 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11670 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
11680 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
11690 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
116a0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
116b0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
116c0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
116d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
116e0 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
116f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
11700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11710 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11720 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
11730 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
11740 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11750 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
11760 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
11770 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
11780 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
11790 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
117a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
117b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
117c0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
117d0 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
117e0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
117f0 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
11800 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
11810 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
11820 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
11830 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
11840 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
11850 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
11860 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
11870 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
11880 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
11890 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
118a0 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
118b0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
118c0 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
118d0 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
118e0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
118f0 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
11900 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
11910 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
11920 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
11930 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
11940 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
11950 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
11960 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
11970 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
11980 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
11990 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
119a0 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
119b0 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
119c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
119d0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
119e0 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
119f0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
11a00 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
11a10 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
11a20 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
11a30 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
11a40 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
11a50 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
11a60 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
11a70 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
11a80 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
11a90 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
11aa0 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
11ab0 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
11ac0 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
11ad0 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
11ae0 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
11af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11b00 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
11b10 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
11b20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
11b30 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
11b40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11b50 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
11b60 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
11b70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
11b80 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
11b90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
11ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
11bb0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
11bc0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
11bd0 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
11be0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11bf0 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
11c00 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
11c10 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
11c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11c30 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
11c40 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
11c50 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
11c60 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
11c70 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
11c80 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
11c90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11cb0 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
11cc0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
11cd0 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
11d00 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
11d10 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
11d20 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
11d30 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
11d40 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
11d50 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
11d60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11d80 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
11d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
11da0 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
11dd0 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
11de0 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
11df0 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
11e00 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
11e10 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
11e20 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
11e30 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
11e40 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
11e50 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
11e60 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
11e70 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
11e80 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
11e90 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
11ea0 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
11eb0 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
11ec0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
11ed0 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
11ee0 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
11ef0 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
11f00 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
11f10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
11f20 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
11f30 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
11f40 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
11f50 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
11f60 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
11f70 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
11f80 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
11fb0 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
11fc0 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
11ff0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
12000 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
12010 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
12020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
12030 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
12040 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12050 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
12060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
12070 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
12080 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
12090 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
120a0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
120b0 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
120c0 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
120d0 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
120e0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
120f0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
12100 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
12110 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
12120 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
12130 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
12140 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
12150 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
12160 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
12170 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
12180 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
12190 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
121a0 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
121b0 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
121c0 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
121d0 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
121e0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
121f0 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
12200 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
12210 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
12220 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
12230 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
12240 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
12250 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
12260 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
12270 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
12280 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
12290 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
122a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
122b0 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
122c0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
122d0 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
122e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
122f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
12300 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
12310 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
12320 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
12330 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
12340 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
12350 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
12360 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12370 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
12380 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
12390 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
123a0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
123b0 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
123c0 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
123d0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
123e0 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
123f0 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
12400 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
12410 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
12420 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
12430 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
12440 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
12450 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12460 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
12470 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
12480 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
12490 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
124a0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
124b0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
124c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
124d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
124e0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
124f0 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
12500 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
12510 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
12520 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12530 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
12540 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
12550 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
12560 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
12570 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
12580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12590 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
125a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
125b0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
125c0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
125d0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
125e0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
125f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
12600 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
12610 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
12620 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
12630 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
12640 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
12670 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
12680 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12690 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
126a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
126b0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
126c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
126d0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
126e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
126f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12700 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
12710 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
12720 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
12730 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12740 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12750 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
12760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12770 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
12780 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
12790 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
127a0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
127b0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
127c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
127d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
127e0 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
127f0 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
12800 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
12810 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
12820 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
12830 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
12840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12850 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
12860 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
12870 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
12880 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
12890 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
128a0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
128b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
128c0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
128d0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
128e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
128f0 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
12900 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
12910 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
12920 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
12930 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
12940 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
12950 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
12960 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
12970 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
12980 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
12990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
129a0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
129b0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
129c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
129d0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
129e0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
129f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12a00 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
12a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12a20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
12a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
12a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
12a50 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
12a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12a70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
12a80 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
12a90 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
12aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12ab0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12ac0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12ad0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
12ae0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
12af0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12b00 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12b10 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
12b20 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
12b30 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
12b40 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
12b50 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
12b60 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
12b70 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
12b80 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
12b90 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
12ba0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
12bb0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
12bc0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
12bd0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
12be0 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
12bf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
12c00 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
12c10 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
12c20 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
12c30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
12c40 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
12c50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
12c60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
12c70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
12c80 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
12c90 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
12ca0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
12cb0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
12cc0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
12cd0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
12ce0 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
12cf0 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
12d00 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
12d10 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
12d20 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
12d30 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
12d40 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
12d50 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
12d60 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
12d70 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
12d80 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
12d90 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
12da0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
12db0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
12dc0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
12dd0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
12de0 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
12df0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
12e00 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
12e10 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
12e20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
12e30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12e40 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
12e50 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
12e60 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12e70 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
12e80 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
12e90 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
12ec0 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
12ed0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
12ee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12f00 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
12f10 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
12f20 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
12f30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12f40 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
12f50 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
12f60 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
12f70 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
12f80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
12f90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12fa0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
12fb0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
12fc0 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
12fd0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
12fe0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
12ff0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
13000 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
13010 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
13020 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
13030 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
13040 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
13050 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
13060 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
13070 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
13080 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
13090 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
130a0 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
130b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
130c0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
130d0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
130e0 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
130f0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13100 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
13110 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
13120 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
13130 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
13140 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
13150 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
13160 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
13170 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
13180 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
13190 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
131a0 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
131b0 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
131c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
131d0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
131e0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
131f0 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
13200 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
13210 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
13220 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
13230 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
13240 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
13250 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
13260 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
13270 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
13280 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
13290 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
132a0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
132b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
132c0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
132d0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
132e0 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
132f0 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
13300 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
13310 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
13320 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
13330 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
13340 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
13350 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
13360 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13370 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
13380 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
13390 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
133a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
133b0 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
133c0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
133d0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
133e0 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
133f0 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
13400 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13410 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
13420 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
13430 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
13440 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
13450 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
13460 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
13470 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
13480 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
13490 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
134a0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
134b0 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
134c0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
134d0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
134e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
134f0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
13500 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13510 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
13520 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
13530 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
13540 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
13550 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
13560 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
13570 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
13580 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
13590 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
135a0 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
135b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
135c0 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
135d0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
135e0 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
135f0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13600 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
13610 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
13620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13630 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
13640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13650 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13660 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
13670 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
13680 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
13690 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
136a0 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
136b0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
136c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
136d0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
136e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
136f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
13700 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
13710 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
13720 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13730 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
13740 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
13750 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
13760 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
13770 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13780 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
13790 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
137a0 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
137b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
137c0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
137d0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
137e0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
137f0 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
13800 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
13810 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
13820 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
13830 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
13840 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
13850 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
13860 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
13870 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
13880 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
13890 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
138a0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
138b0 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
138c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
138d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
138e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
138f0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
13900 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
13910 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13920 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
13930 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
13940 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
13950 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13960 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
13970 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
13980 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
13990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
139a0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
139b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
139c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
139d0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
139e0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
139f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13a00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13a10 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13a20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
13a30 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
13a40 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13a50 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
13a60 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
13a70 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13a80 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
13a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13aa0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13ab0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
13ac0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
13ad0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13ae0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13af0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13b10 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
13b20 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
13b30 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
13b40 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
13b50 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
13b60 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
13b70 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
13b80 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
13b90 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
13ba0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
13bb0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
13bc0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
13bd0 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
13be0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
13bf0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13c00 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
13c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13c20 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13c30 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
13c40 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
13c50 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
13c60 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
13c70 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
13c80 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
13c90 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
13ca0 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
13cb0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
13cc0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
13cd0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
13ce0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
13cf0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
13d00 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
13d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13d20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
13d30 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
13d40 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
13d50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
13d60 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
13d70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13d80 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
13d90 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
13da0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13db0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
13dc0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
13dd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
13de0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
13df0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
13e00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
13e10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
13e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
13e30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13e40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
13e50 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
13e60 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
13e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
13e90 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
13ea0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
13eb0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
13ec0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
13ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13ee0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
13ef0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13f00 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
13f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
13f20 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
13f30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
13f40 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
13f50 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
13f60 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
13f70 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
13f80 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
13f90 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
13fa0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
13fb0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
13fc0 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
13fd0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
13fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
13ff0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
14000 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
14010 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14020 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
14030 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
14040 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
14050 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
14060 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
14070 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
14080 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14090 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
140a0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
140b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
140c0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
140d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
140e0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
140f0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
14100 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
14110 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
14120 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
14130 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
14140 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
14150 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
14160 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
14170 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
14180 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
14190 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
141a0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
141b0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
141c0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
141d0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
141e0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
141f0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14200 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14210 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
14220 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
14230 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
14240 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
14250 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
14260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14270 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
14280 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
14290 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
142a0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
142b0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
142c0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
142d0 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
142e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
142f0 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
14300 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
14310 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
14320 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
14330 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14340 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14350 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
14360 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14370 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14380 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
14390 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
143a0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
143b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
143c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
143d0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
143e0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
143f0 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
14400 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
14410 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
14420 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
14430 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
14440 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
14450 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
14460 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14480 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
14490 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
144a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
144b0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
144c0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
144d0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
144e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
144f0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
14500 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
14510 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
14520 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
14530 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
14540 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
14550 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
14560 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
14570 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
14580 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
14590 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
145a0 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
145b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
145c0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
145d0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
145e0 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
145f0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
14600 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
14610 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
14620 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
14630 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
14640 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
14650 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
14660 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
14670 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
14680 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
14690 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
146a0 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
146b0 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
146c0 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
146d0 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
146e0 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
146f0 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
14700 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
14710 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
14720 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
14730 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
14740 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
14750 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
14760 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
14770 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
14780 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
14790 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
147a0 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
147b0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
147c0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
147d0 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
147e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
147f0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
14800 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
14810 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
14820 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
14830 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
14840 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
14850 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
14860 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
14870 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
14880 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
14890 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
148a0 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
148b0 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
148c0 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
148d0 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
148e0 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
148f0 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
14900 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
14910 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
14920 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
14930 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
14940 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
14950 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
14960 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
14970 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
14980 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14990 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
149a0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
149b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
149c0 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
149d0 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
149e0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
149f0 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
14a00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
14a10 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
14a20 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
14a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
14a40 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
14a50 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
14a60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14a70 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
14a80 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
14a90 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
14aa0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
14ab0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
14ac0 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
14ad0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
14ae0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
14af0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
14b00 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
14b10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
14b20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
14b30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14b40 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
14b50 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
14b60 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
14b70 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
14b80 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
14b90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14ba0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
14bb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
14bc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14bd0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
14be0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
14bf0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
14c00 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
14c10 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
14c20 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
14c30 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
14c40 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
14c50 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
14c60 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
14c70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
14c80 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
14c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
14ca0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
14cb0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
14cc0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
14cd0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
14ce0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
14cf0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
14d00 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
14d10 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
14d20 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
14d30 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
14d40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14d50 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
14d60 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
14d70 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
14d80 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
14d90 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
14da0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
14db0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
14dc0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
14dd0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
14de0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
14df0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
14e00 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
14e10 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
14e20 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
14e30 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
14e40 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
14e50 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
14e60 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
14e70 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
14e80 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
14e90 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
14ea0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
14eb0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
14ec0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
14ed0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
14ee0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
14ef0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
14f00 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
14f10 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
14f20 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
14f30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
14f40 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
14f50 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14f60 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
14f70 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
14f80 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
14f90 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
14fa0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
14fb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14fc0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
14fd0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
14fe0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
14ff0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
15000 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
15010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15020 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
15030 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15040 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15050 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
15060 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
15070 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
15080 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
15090 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
150a0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
150b0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
150c0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
150d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
150e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
150f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
15100 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
15110 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
15120 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
15130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
15140 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
15150 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
15160 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
15170 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
15180 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
15190 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
151a0 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
151b0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
151c0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
151d0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
151e0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
151f0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
15200 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
15210 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
15220 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
15230 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
15240 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
15250 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
15260 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
15270 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
15280 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
15290 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
152a0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
152b0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
152c0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
152d0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
152e0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
152f0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
15300 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
15310 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
15320 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
15330 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
15340 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
15350 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
15360 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
15370 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
15380 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
15390 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
153a0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
153b0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
153c0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
153d0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
153e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
153f0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
15400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15410 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15420 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15430 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
15440 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15450 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
15460 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
15470 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15480 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15490 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
154a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
154b0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
154c0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
154d0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
154e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
154f0 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
15500 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
15510 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15520 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
15530 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
15540 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
15550 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15560 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
15570 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15580 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15590 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
155a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
155b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
155c0 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
155d0 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
155e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
155f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
15610 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
15620 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
15630 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
15640 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
15650 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
15660 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
15670 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
15680 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
15690 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
156a0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
156b0 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
156c0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
156d0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
156e0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
156f0 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
15700 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
15710 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
15720 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15730 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
15740 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
15750 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
15760 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
15770 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
15780 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
15790 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
157a0 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
157b0 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
157c0 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
157d0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
157e0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
157f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15800 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
15810 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
15820 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
15830 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
15840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15850 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
15860 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
15870 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
15880 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
15890 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
158a0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
158b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
158c0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
158d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
158e0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
158f0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15900 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15910 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
15920 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
15930 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
15940 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15950 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15960 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
15980 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
15990 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
159a0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
159b0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
159c0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
159d0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
159e0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
159f0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
15a00 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
15a10 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
15a20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15a30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15a40 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
15a50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15a60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15a70 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
15a80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15a90 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
15aa0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
15ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15ac0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
15ad0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
15ae0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15b00 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15b10 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
15b20 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
15b30 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
15b40 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
15b50 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
15b60 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
15b70 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
15b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
15b90 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
15ba0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
15bb0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
15bc0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
15bd0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
15be0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
15bf0 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
15c00 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
15c10 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
15c20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
15c30 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
15c40 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
15c50 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
15c60 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
15c70 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
15c80 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
15c90 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
15ca0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
15cb0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
15cc0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
15cd0 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
15ce0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
15cf0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
15d00 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
15d10 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
15d20 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
15d30 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
15d40 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
15d50 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
15d60 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
15d70 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
15d80 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
15d90 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
15da0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
15db0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
15dc0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
15dd0 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
15de0 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
15df0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
15e00 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
15e10 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
15e20 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
15e30 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
15e40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15e50 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
15e60 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
15e70 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
15e80 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
15e90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15ea0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15eb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15ec0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
15ed0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
15ee0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
15ef0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
15f00 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
15f10 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
15f20 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
15f30 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
15f40 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
15f50 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
15f60 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
15f70 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
15f80 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
15f90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
15fa0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
15fb0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
15fc0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
15fd0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
15fe0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
15ff0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
16000 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
16010 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
16020 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
16030 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
16040 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
16050 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
16060 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
16070 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
16080 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
16090 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
160a0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
160b0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
160c0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
160d0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
160e0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
160f0 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
16100 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16110 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
16120 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
16130 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
16140 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
16150 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
16160 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
16170 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16180 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
16190 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
161a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
161b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
161c0 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
161d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
161e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
161f0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
16200 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
16210 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
16220 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
16230 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
16240 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
16250 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
16260 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16270 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
16280 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
16290 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
162a0 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
162b0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
162c0 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
162d0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
162e0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
162f0 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
16300 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
16310 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
16320 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
16330 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
16340 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
16350 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
16360 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
16370 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
16380 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
16390 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
163a0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
163b0 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
163c0 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
163d0 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
163e0 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
163f0 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
16400 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
16410 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
16420 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
16430 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
16440 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
16450 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
16460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16470 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
16480 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
16490 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
164a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
164b0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
164c0 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
164d0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
164e0 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
164f0 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
16500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16510 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16520 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
16530 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
16540 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
16550 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
16560 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
16570 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
16580 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
16590 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
165a0 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
165b0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
165c0 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
165d0 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
165e0 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
165f0 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
16600 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
16610 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
16620 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
16630 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
16640 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
16650 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16660 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
16670 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
16680 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
16690 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
166a0 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
166b0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
166c0 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
166d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
166e0 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
166f0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
16700 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
16710 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
16720 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
16730 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16740 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
16750 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
16760 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
16770 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
16780 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
16790 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
167a0 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
167b0 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
167c0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
167d0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
167e0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
167f0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
16800 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
16810 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
16820 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
16830 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
16840 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
16850 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16860 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
16870 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
16880 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
16890 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
168a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
168b0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
168c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42  ./*.** Set the B
168d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
168e0 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
168f0 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
16900 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
16910 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
16920 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
16930 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
16940 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55   of the BTS_SECU
16950 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74  RE_DELETE.** set
16960 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
16970 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
16980 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
16990 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
169a0 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
169b0 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
169c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
169d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
169e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
169f0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
16a00 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
16a10 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44  &= ~BTS_SECURE_D
16a20 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e  ELETE;.    if( n
16a30 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d  ewFlag ) p->pBt-
16a40 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16a50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
16a60 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70    } .  b = (p->p
16a70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16a80 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16a90 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  )!=0;.  sqlite3B
16aa0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16ab0 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a  return b;.}../*.
16ac0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
16ad0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
16ae0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
16af0 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
16b00 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
16b10 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
16b20 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
16b30 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
16b40 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
16b50 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
16b60 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
16b70 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
16b80 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
16b90 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
16ba0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
16bb0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
16bc0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
16bd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16be0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
16bf0 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
16c00 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
16c10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16c20 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
16c30 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
16c40 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
16c50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16c60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16c70 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
16c80 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
16c90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16ca0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
16cb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16cc0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16cd0 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
16ce0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
16cf0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
16d00 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
16d20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
16d30 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
16d40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
16d50 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
16d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16d70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16d80 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
16d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
16da0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
16db0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
16dc0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
16dd0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
16de0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
16df0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
16e00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16e10 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
16e20 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
16e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16e40 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
16e50 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
16e60 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
16e70 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
16e80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16e90 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
16ea0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
16eb0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
16ec0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
16ed0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
16ee0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
16ef0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
16f00 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
16f10 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
16f20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16f30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
16f40 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
16f50 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
16f60 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
16f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16f80 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
16f90 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
16fa0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
16fb0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
16fc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
16fd0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
16fe0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
16ff0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
17000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17010 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
17020 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
17030 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
17040 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
17050 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
17060 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
17070 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
17080 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
17090 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
170a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
170b0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
170c0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170e0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
170f0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
17100 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
17110 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
17120 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
17130 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17140 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
17150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17160 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17170 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
17180 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
17190 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
171a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
171b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
171c0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
171d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
171e0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
171f0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
17200 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
17210 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17220 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
17240 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
17250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17260 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
17270 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
17280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17290 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
172a0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
172b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
172c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
172d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
172e0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
172f0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
17300 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
17310 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
17320 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
17330 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
17340 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
17350 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
17360 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
17370 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
17380 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
17390 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
173a0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
173b0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
173c0 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
173d0 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
173e0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
173f0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
17400 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
17410 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
17420 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
17430 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
17440 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
17450 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
17460 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
17470 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
17480 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
17490 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
174a0 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39  F: R-43737-39999
174b0 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c   Every valid SQL
174c0 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
174d0 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20  e begins.    ** 
174e0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
174f0 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20  ng 16 bytes (in 
17500 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36  hex): 53 51 4c 6
17510 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66  9 74 65 20 66 6f
17520 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31   72 6d.    ** 61
17530 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f   74 20 33 00. */
17540 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
17550 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
17560 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
17570 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
17580 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
17590 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
175a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
175b0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
175c0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
175d0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
175e0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
175f0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
17600 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
17610 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17620 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
17630 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
17640 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
17650 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
17660 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
17670 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
17680 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
17690 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
176a0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
176b0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
176c0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
176d0 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
176e0 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
176f0 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
17700 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
17710 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
17720 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
17730 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
17740 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
17750 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
17760 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
17770 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
17780 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
17790 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
177a0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
177b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
177c0 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
177d0 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
177e0 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
177f0 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
17800 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
17810 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
17820 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
17830 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
17840 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
17850 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
17860 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
17870 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
17880 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
17890 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
178a0 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
178b0 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
178c0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
178d0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
178e0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
178f0 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
17900 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17910 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
17920 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17930 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
17940 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
17950 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
17960 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
17970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17980 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
17990 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
179a0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
179b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
179c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
179d0 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
179e0 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
179f0 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
17a00 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
17a10 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
17a20 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
17a30 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
17a40 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
17a50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17a60 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
17a70 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
17a80 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
17a90 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
17aa0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
17ab0 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
17ac0 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
17ad0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
17ae0 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
17af0 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
17b00 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
17b10 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17b20 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
17b30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17b40 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
17b50 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
17b60 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
17b70 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
17b80 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
17b90 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
17ba0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
17bb0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
17bc0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
17bd0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
17be0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
17bf0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
17c00 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
17c10 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
17c20 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
17c30 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
17c40 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
17c50 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
17c60 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
17c70 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
17c80 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
17c90 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
17ca0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
17cb0 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
17cc0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
17cd0 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
17ce0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
17cf0 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
17d00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17d10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
17d20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
17d30 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
17d40 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17d50 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
17d60 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
17d70 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
17d80 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
17d90 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
17da0 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
17db0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17dc0 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17dd0 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
17de0 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
17df0 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
17e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
17e10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
17e20 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
17e30 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
17e40 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
17e50 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
17e60 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
17e70 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
17e80 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
17e90 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
17ea0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17eb0 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
17ec0 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
17ed0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
17ee0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
17ef0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
17f00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
17f10 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
17f20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
17f30 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
17f40 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
17f50 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
17f60 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
17f70 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
17f80 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
17f90 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
17fa0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
17fb0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
17fc0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
17fd0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
17fe0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
17ff0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
18000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
18010 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
18020 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
18030 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
18040 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
18050 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
18060 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
18070 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
18080 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
18090 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
180a0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
180b0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
180c0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
180d0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
180e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
180f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
18100 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
18110 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
18150 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
18160 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18170 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
18180 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
18190 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
181a0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
181b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
181c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
181d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
181e0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
181f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
18200 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18210 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
18220 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
18230 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
18240 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
18250 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
18260 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18270 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
18280 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
18290 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
182a0 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
182b0 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
182c0 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
182d0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
182e0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
182f0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18300 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18310 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18320 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
18330 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
18340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18350 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18360 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
18370 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
18380 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
18390 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
183a0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
183b0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
183c0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
183d0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
183e0 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
183f0 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
18400 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
18410 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
18420 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
18430 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
18440 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
18450 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
18460 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
18470 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
18480 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
18490 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
184a0 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
184b0 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
184c0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
184d0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
184e0 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
184f0 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
18500 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
18510 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
18520 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
18530 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
18540 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
18550 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
18560 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
18570 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
18580 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
18590 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
185a0 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
185b0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
185c0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
185d0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
185e0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
185f0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
18600 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
18610 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
18620 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
18630 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
18640 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
18650 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
18660 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
18670 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
18680 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
18690 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
186a0 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
186b0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
186c0 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
186d0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
186e0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
186f0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
18700 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
18710 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
18720 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
18730 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
18740 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18750 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
18760 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
18770 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
18780 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
18790 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
187a0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
187b0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
187c0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
187d0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
187e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
187f0 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
18800 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
18810 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
18820 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
18830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18840 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18860 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
18870 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
18880 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
18890 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
188a0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
188b0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
188c0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
188d0 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
188e0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
188f0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
18900 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
18910 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
18920 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
18930 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
18940 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
18950 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
18960 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
18970 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
18980 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
18990 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
189a0 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
189b0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
189c0 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
189d0 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
189e0 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
189f0 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
18a00 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
18a10 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
18a20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
18a30 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
18a40 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
18a50 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
18a60 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
18a70 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
18a80 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
18a90 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
18aa0 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
18ab0 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
18ac0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
18ad0 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
18ae0 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
18af0 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
18b00 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
18b10 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
18b20 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
18b30 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
18b40 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
18b50 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
18b60 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
18b70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
18b80 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
18b90 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
18ba0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
18bb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
18bc0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
18bd0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
18be0 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
18bf0 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
18c00 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
18c10 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
18c20 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
18c30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
18c40 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
18c50 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18c60 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
18c70 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
18c80 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
18c90 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
18ca0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18cb0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
18cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
18cd0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
18ce0 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
18cf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
18d00 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
18d10 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
18d20 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
18d30 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
18d40 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
18d50 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
18d60 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
18d70 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
18d80 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
18d90 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
18da0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
18db0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
18dc0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
18dd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
18de0 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a  otNull(pPage1);.
18df0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
18e00 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
18e10 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
18e20 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
18e30 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
18e40 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
18e50 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
18e60 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
18e70 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
18e80 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
18e90 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
18ea0 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
18eb0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
18ec0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
18ed0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
18ee0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
18ef0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18f00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
18f10 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
18f20 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
18f30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18f40 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
18f50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
18f60 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
18f70 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
18f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18f90 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
18fa0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
18fb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
18fc0 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
18fd0 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
18fe0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
18ff0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
19000 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
19010 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
19020 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
19030 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
19040 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
19050 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
19060 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
19070 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
19080 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
19090 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
190a0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
190b0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
190c0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
190d0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
190e0 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
190f0 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
19100 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
19110 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
19120 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
19130 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
19140 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
19150 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
19160 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
19170 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
19180 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
19190 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
191a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
191b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
191c0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
191d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
191e0 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
191f0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
19200 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
19210 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
19220 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
19230 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
19240 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
19250 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
19260 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
19270 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
19280 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19290 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
192a0 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
192b0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
192c0 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
192d0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
192e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
192f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
19300 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19320 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
19330 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
19340 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
19350 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
19360 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
19370 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
19380 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
19390 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
193a0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
193b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
193c0 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
193d0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
193e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
193f0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
19400 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
19410 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
19420 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
19430 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19450 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19460 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
19470 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
19480 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
19490 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
194a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
194b0 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
194c0 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
194d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
194e0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
194f0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
19500 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
19510 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
19520 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
19530 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
19540 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
19550 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
19560 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
19570 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
19580 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
19590 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
195a0 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
195b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
195c0 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
195d0 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
195e0 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
195f0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
19600 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19610 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
19620 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
19630 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
19640 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
19650 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
19660 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19670 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
19680 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
19690 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
196a0 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
196b0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
196c0 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
196d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
196e0 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
196f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
19700 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
19710 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19720 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
19730 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19740 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
19750 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19760 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
19770 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
19780 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
19790 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
197a0 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
197b0 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
197c0 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
197d0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
197e0 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
197f0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
19800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
19810 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
19820 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
19830 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
19840 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
19850 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
19860 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
19870 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
19880 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
19890 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
198a0 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
198b0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
198c0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
198d0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
198e0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
198f0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
19900 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
19910 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
19920 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
19930 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
19940 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
19950 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
19960 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
19970 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
19980 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
19990 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
199a0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
199b0 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
199c0 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
199d0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
199e0 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
199f0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
19a00 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
19a10 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
19a20 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
19a30 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
19a40 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
19a50 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
19a60 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
19a70 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
19a80 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
19a90 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
19aa0 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
19ab0 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
19ac0 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
19ad0 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
19ae0 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
19af0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
19b00 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
19b10 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
19b20 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
19b30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19b40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
19b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19b60 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
19b70 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
19b80 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
19b90 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
19ba0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
19bb0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
19bc0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
19bd0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
19be0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
19bf0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
19c00 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
19c10 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
19c20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
19c30 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
19c40 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
19c50 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
19c60 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
19c70 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
19c80 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
19c90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
19ca0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
19cb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
19cc0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
19cd0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
19ce0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
19cf0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
19d00 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
19d10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
19d20 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
19d30 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19d40 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
19d50 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
19d60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
19d70 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
19d80 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
19d90 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
19da0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
19db0 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
19dc0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
19dd0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
19de0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
19df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
19e00 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
19e10 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
19e20 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
19e30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
19e40 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
19e50 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
19e60 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
19e70 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
19e80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19e90 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
19ea0 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
19eb0 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
19ec0 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  NG)!=0.  ){.    
19ed0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
19ee0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
19ef0 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
19f00 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
19f10 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
19f20 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
19f30 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
19f40 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
19f50 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
19f60 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
19f70 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
19f80 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
19f90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19fb0 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
19fc0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
19fd0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
19fe0 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
19ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1a000 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1a010 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1a020 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
1a030 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1a040 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1a050 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1a060 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1a070 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1a080 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1a090 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1a0a0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1a0b0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1a0c0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1a0d0 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1a0e0 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1a0f0 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1a100 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1a110 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1a120 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1a130 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1a140 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1a150 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1a160 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1a170 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1a180 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1a190 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1a1a0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a1b0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1a1c0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1a1d0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1a1e0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1a1f0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1a200 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1a210 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1a220 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1a230 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1a240 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1a250 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1a260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1a270 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1a280 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1a290 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1a2a0 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1a2b0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1a2c0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1a2d0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1a2e0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1a2f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1a300 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1a310 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1a320 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1a330 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1a340 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1a350 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1a360 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1a370 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1a380 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1a390 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1a3a0 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1a3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a3c0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1a3d0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1a3e0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1a3f0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1a400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1a410 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1a420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1a430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1a440 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1a450 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1a460 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1a470 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1a480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1a4a0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1a4b0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
1a4c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1a4d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a4e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
1a4f0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1a500 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
1a510 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
1a520 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
1a530 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1a540 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1a550 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
1a560 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
1a570 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
1a580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a590 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1a5a0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a5b0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1a5c0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1a5d0 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1a5e0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1a5f0 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1a600 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1a610 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1a620 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1a630 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1a640 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1a650 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1a660 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1a670 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1a680 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1a690 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1a6a0 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1a6b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a6c0 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1a6d0 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1a6e0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1a6f0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1a700 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1a710 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1a720 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1a730 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1a740 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1a750 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1a760 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a770 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a780 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a790 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1a7a0 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1a7b0 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1a7c0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1a7d0 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1a7e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1a7f0 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1a800 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1a810 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1a820 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1a830 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1a840 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1a850 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1a860 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1a870 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1a880 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1a890 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1a8a0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1a8b0 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1a8c0 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1a8d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1a8e0 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1a8f0 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1a900 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1a910 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1a920 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1a930 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1a940 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1a950 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1a960 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1a970 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1a980 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1a990 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1a9a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1a9b0 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1a9c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1a9d0 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1a9e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a9f0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1aa00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1aa10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aa20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1aa30 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1aa40 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1aa50 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1aa60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1aa70 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1aa80 45 78 70 65 72 69 6d 65 6e 74 61 6c 4c 6f 67 28  ExperimentalLog(
1aa90 70 2d 3e 70 4c 6f 67 2c 20 22 25 73 20 54 4d 22  p->pLog, "%s TM"
1aaa0 2c 0a 20 20 20 20 77 72 66 6c 61 67 3d 3d 30 20  ,.    wrflag==0 
1aab0 3f 20 22 62 65 67 69 6e 2d 72 65 61 64 22 20 3a  ? "begin-read" :
1aac0 20 28 77 72 66 6c 61 67 3e 32 20 3f 20 22 62 65   (wrflag>2 ? "be
1aad0 67 69 6e 2d 65 78 63 6c 75 73 69 76 65 22 20 3a  gin-exclusive" :
1aae0 20 22 62 65 67 69 6e 2d 77 72 69 74 65 22 29 29   "begin-write"))
1aaf0 3b 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  ;...trans_begun:
1ab00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ab10 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1ab20 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1ab30 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1ab40 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1ab50 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1ab60 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
1ab70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
1ab80 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
1ab90 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
1aba0 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
1abb0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
1abc0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
1abd0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
1abe0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1abf0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1ac00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ac10 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1ac20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
1ac30 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
1ac40 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1ac50 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
1ac60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ac70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ac80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ac90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1aca0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
1acb0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
1acc0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
1acd0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
1ace0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
1acf0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
1ad00 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
1ad10 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1ad20 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
1ad30 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
1ad40 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
1ad50 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
1ad60 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1ad70 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1ad80 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1ad90 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1adc0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
1add0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ae00 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
1ae10 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ae40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1ae50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ae60 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
1ae70 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
1ae80 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
1ae90 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1aea0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1aeb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1aec0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1aed0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1aee0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
1aef0 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1af00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1af10 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
1af20 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
1af30 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
1af40 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1af50 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1af60 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1af70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1af80 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1af90 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1afa0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1afb0 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1afc0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1afd0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1afe0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1aff0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1b000 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1b010 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1b020 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1b030 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b040 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1b050 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1b060 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1b070 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b080 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1b090 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1b0a0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1b0b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1b0c0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1b0d0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
1b0e0 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
1b0f0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1b100 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
1b110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1b120 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1b130 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1b140 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1b150 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1b160 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1b170 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1b180 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1b190 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1b1a0 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1b1b0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1b1c0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1b1d0 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1b1e0 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1b1f0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1b200 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1b210 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1b230 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1b240 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1b250 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1b260 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1b270 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1b280 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2a0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1b2b0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1b2c0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1b2d0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1b2e0 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1b2f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1b300 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1b310 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1b320 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b330 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1b340 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1b350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b360 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1b370 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1b380 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1b390 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1b3a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1b3b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b3c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1b3d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1b3e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1b3f0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1b400 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1b410 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1b420 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1b430 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1b440 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1b450 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1b460 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1b470 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1b480 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1b490 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1b4a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1b4b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1b4c0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
1b4d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1b4e0 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
1b4f0 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
1b500 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
1b510 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
1b520 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
1b530 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
1b540 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
1b550 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1b560 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b570 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
1b580 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1b590 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1b5a0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1b5b0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1b5c0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1b5d0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1b5e0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1b5f0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
1b600 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1b610 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
1b620 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
1b630 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1b640 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
1b650 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
1b660 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
1b670 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
1b680 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1b690 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
1b6a0 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
1b6b0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
1b6c0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
1b6d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1b6e0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
1b6f0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
1b700 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
1b710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b720 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1b730 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1b740 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1b750 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1b760 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1b770 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1b780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b790 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b7a0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1b7b0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1b7c0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1b7d0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1b7e0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1b7f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1b800 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1b810 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1b820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b830 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b840 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1b850 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1b860 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1b870 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1b880 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1b890 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1b8a0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1b8b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b8c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1b8d0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1b8e0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1b8f0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1b900 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1b910 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1b920 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1b930 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1b940 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1b950 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1b960 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1b970 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1b980 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1b990 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1b9a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1b9b0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1b9c0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1b9d0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1b9e0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1b9f0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1ba00 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1ba10 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1ba20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1ba30 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1ba40 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1ba50 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1ba60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1ba70 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1ba80 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1ba90 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1baa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bab0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1bac0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1bad0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1bae0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1baf0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1bb00 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1bb10 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1bb20 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1bb30 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1bb40 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1bb50 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1bb60 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1bb70 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1bb80 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1bb90 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1bba0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1bbb0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1bbc0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1bbd0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1bbe0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1bbf0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1bc00 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1bc10 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1bc20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1bc30 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1bc40 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1bc50 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1bc60 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1bc70 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1bc80 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1bc90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1bca0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1bcb0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1bcc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1bcd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1bce0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1bcf0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1bd00 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1bd10 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1bd20 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1bd30 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1bd40 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1bd50 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1bd60 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1bd70 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1bd80 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1bd90 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1bda0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1bdb0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1bdc0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1bdd0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1bde0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1bdf0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1be00 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1be10 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1be20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1be30 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1be40 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1be50 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1be60 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1be70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1be80 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1be90 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1bea0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1beb0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1bec0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1bed0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1bee0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1bef0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1bf00 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1bf10 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1bf20 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1bf30 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1bf40 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1bf50 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1bf60 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1bf70 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1bf80 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1bf90 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1bfa0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1bfb0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1bfc0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1bfd0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1bfe0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1bff0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1c000 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1c010 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1c020 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1c030 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1c040 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1c050 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1c060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c080 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1c090 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1c0a0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1c0b0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1c0c0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1c0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1c0e0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1c0f0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1c100 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1c110 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1c120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c130 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1c140 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1c150 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1c160 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1c170 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1c180 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1c190 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1c1a0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1c1b0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1c1c0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1c1d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1c1e0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1c1f0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1c200 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1c210 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1c220 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1c230 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1c240 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1c250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c270 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c290 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1c2a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1c2b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c2c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c2d0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1c2e0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1c2f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c300 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1c310 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1c320 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1c330 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1c340 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1c350 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1c360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c370 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1c380 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1c390 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1c3a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1c3b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c3c0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1c3d0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1c3e0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1c3f0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1c400 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1c410 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1c420 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1c430 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1c440 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1c450 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1c460 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1c470 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1c480 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1c490 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1c4a0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1c4b0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1c4c0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1c4d0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1c4e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1c4f0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1c500 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1c510 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1c520 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1c530 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1c540 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1c550 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1c560 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1c570 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1c580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1c590 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1c5a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1c5b0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1c5c0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1c5d0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1c5e0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1c5f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1c600 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1c610 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1c620 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1c630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1c640 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1c650 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1c660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1c670 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1c680 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1c690 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1c6a0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1c6b0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1c6c0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1c6d0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1c6e0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1c6f0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1c700 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1c710 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1c720 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1c730 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1c740 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1c750 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1c760 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1c770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1c780 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1c790 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1c7a0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1c7b0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1c7c0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1c7d0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1c7e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1c7f0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1c800 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1c810 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1c820 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c830 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1c850 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1c860 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1c870 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1c880 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1c890 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1c8a0 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1c8b0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1c8c0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1c8d0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1c8e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1c8f0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1c900 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1c910 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c920 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1c930 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1c940 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1c950 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1c960 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1c970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c980 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c990 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1c9a0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1c9b0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1c9c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c9d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c9e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1c9f0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1ca00 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1ca10 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1ca20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1ca30 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1ca40 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1ca50 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1ca60 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1ca70 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1ca80 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1ca90 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1caa0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1cab0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1cac0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1cad0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1cae0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1caf0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1cb00 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1cb10 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1cb20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1cb30 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1cb40 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1cb50 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1cb60 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1cb70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1cb80 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1cb90 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1cba0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1cbb0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1cbc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1cbd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cbe0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1cbf0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1cc00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1cc10 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1cc20 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1cc30 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1cc40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1cc50 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1cc60 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1cc70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1cc80 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1cc90 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1cca0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1ccb0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1ccc0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1ccd0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1cce0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1ccf0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1cd00 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1cd10 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1cd20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1cd30 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1cd40 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1cd50 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1cd60 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1cd70 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1cd80 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1cd90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cda0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1cdb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1cdc0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1cdd0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1cde0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1cdf0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1ce00 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1ce10 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1ce20 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1ce30 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1ce40 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1ce50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1ce60 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1ce70 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1ce80 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1ce90 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1cea0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1ceb0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1cec0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1ced0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1cee0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1cef0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1cf00 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1cf10 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1cf20 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1cf30 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1cf40 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1cf50 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1cf60 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1cf70 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1cf80 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1cf90 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1cfa0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1cfb0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1cfc0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1cfd0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1cfe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cff0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d000 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1d010 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d030 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d040 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1d050 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1d060 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1d070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d080 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1d090 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1d0a0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1d0b0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1d0c0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1d0d0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1d0e0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1d0f0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1d100 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d120 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d130 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d140 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1d150 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1d160 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1d170 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1d180 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1d190 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1d1a0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1d1b0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1d1c0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1d1d0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1d1e0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1d1f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d210 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1d220 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1d230 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1d240 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1d250 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1d260 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1d270 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1d280 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1d290 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1d2a0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1d2b0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1d2c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1d2d0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1d2e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1d2f0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1d300 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1d310 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1d320 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1d330 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1d340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d350 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1d360 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1d370 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1d380 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1d390 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d3a0 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1d3b0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1d3c0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1d3f0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1d400 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1d410 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1d420 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1d430 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1d440 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1d450 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1d460 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1d470 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1d480 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1d490 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1d4a0 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1d4b0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1d4c0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1d4d0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1d4e0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1d4f0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1d500 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d510 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1d520 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1d530 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1d540 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1d550 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1d560 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1d570 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1d580 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1d590 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1d5a0 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1d5b0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1d5c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1d5d0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1d5e0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1d5f0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1d600 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1d610 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1d620 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1d630 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1d640 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1d650 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1d660 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1d670 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1d680 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1d690 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d6a0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1d6b0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1d6c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1d6d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1d6e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d6f0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1d700 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d710 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1d720 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1d730 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1d740 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1d750 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1d760 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d770 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1d780 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1d790 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1d7a0 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1d7b0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1d7c0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d7d0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1d7e0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1d7f0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1d800 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1d810 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1d820 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1d830 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1d840 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1d850 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1d860 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1d870 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1d880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d890 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1d8a0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1d8b0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1d8c0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1d8d0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1d8e0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1d8f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1d900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d910 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d920 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1d930 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1d940 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1d950 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1d960 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1d970 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1d980 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1d990 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d9a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1d9b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1d9c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1d9d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d9e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1d9f0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1da00 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1da10 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1da20 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1da30 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1da40 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1da50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1da60 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1da70 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1da80 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1da90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1daa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dab0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1dac0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1dad0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1dae0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1daf0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1db00 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1db10 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1db20 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1db30 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1db40 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1db50 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1db60 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1db70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1db80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1db90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1dba0 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1dbb0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1dbc0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1dbd0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1dbe0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1dbf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1dc00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1dc10 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1dc20 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1dc30 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1dc40 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1dc50 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1dc60 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1dc70 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1dc80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1dc90 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1dca0 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1dcb0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1dcc0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1dcd0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1dce0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1dcf0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1dd00 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1dd10 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1dd20 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1dd30 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1dd40 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1dd50 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1dd60 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1dd70 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1dd80 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1dd90 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1dda0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1ddb0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1ddc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1ddd0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1dde0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1ddf0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1de00 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1de10 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1de20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1de30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1de40 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1de50 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1de60 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1de70 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1de80 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1de90 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1dea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1deb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1dec0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1ded0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1dee0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1def0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1df00 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1df10 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1df20 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1df30 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1df40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1df50 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1df60 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1df70 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1df80 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1df90 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1dfa0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1dfb0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1dfc0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1dfd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1dfe0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1dff0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1e000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e010 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1e020 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1e030 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1e040 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e050 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e060 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e070 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1e080 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e090 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1e0a0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e0b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e0c0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1e0d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e0e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e0f0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1e100 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1e110 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1e120 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1e130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e150 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e160 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1e170 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1e180 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1e190 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1e1a0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1e1b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1e1c0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1e1d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e1e0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1e1f0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1e200 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1e210 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1e220 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1e230 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1e240 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1e250 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1e260 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1e270 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1e280 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1e290 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1e2a0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1e2b0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1e2c0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1e2d0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1e2e0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1e2f0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1e300 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1e310 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1e320 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1e330 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1e340 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1e350 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1e360 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1e370 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1e380 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1e390 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1e3a0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1e3b0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1e3c0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1e3d0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1e3e0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1e3f0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1e400 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1e410 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1e420 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1e430 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1e440 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1e450 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1e460 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1e470 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1e480 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e490 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1e4a0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1e4b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1e4c0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1e4d0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1e4e0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1e4f0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1e500 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1e510 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1e520 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1e530 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1e540 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1e550 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1e560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1e570 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1e580 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1e590 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1e5a0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1e5b0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1e5c0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1e5d0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1e5e0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1e5f0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1e600 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1e610 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1e620 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1e630 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1e640 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1e650 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1e660 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1e670 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1e680 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1e690 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1e6a0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1e6b0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1e6c0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1e6d0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1e6e0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1e6f0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1e700 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1e710 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1e720 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1e730 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1e740 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1e750 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1e760 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1e770 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1e780 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1e790 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1e7a0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1e7b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e7c0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1e7d0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1e7e0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1e7f0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1e800 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e810 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1e820 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1e830 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1e840 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1e850 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1e860 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1e870 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e890 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e8a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1e8b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e8c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1e8d0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1e8e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1e8f0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1e900 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1e910 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1e920 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e930 20 20 73 71 6c 69 74 65 33 45 78 70 65 72 69 6d    sqlite3Experim
1e940 65 6e 74 61 6c 4c 6f 67 28 70 2d 3e 70 4c 6f 67  entalLog(p->pLog
1e950 2c 20 22 63 6f 6d 6d 69 74 2d 73 74 61 72 74 20  , "commit-start 
1e960 54 4d 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  TM");.    rc = s
1e970 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1e980 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1e990 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1e9a0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1e9b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1e9c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e9d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e9e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1e9f0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1ea00 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1ea10 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1ea20 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1ea30 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1ea40 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1ea50 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1ea60 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1ea70 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1ea80 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ea90 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
1eaa0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
1eab0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1eac0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1ead0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1eae0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1eaf0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1eb00 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1eb10 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1eb20 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
1eb30 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
1eb40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1eb50 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
1eb60 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
1eb70 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
1eb80 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
1eb90 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
1eba0 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
1ebb0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
1ebc0 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
1ebd0 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
1ebe0 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
1ebf0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ec00 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
1ec10 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
1ec20 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1ec30 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
1ec40 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1ec50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1ec60 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
1ec70 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
1ec80 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
1ec90 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
1eca0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ecb0 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
1ecc0 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
1ecd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ece0 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
1ecf0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
1ed00 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1ed10 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
1ed20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1ed30 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
1ed40 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
1ed50 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
1ed60 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
1ed70 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
1ed80 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
1ed90 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1eda0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1edb0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1edc0 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
1edd0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
1ede0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1edf0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1ee00 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
1ee10 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1ee20 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1ee30 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1ee40 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
1ee50 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
1ee60 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
1ee70 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
1ee80 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
1ee90 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
1eea0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
1eeb0 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
1eec0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1eed0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1eee0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
1eef0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 65 72 69  .  sqlite3Experi
1ef00 6d 65 6e 74 61 6c 4c 6f 67 28 70 2d 3e 70 4c 6f  mentalLog(p->pLo
1ef10 67 2c 20 22 65 6e 64 2d 74 72 61 6e 73 61 63 74  g, "end-transact
1ef20 69 6f 6e 20 54 4d 22 29 3b 0a 0a 20 20 62 74 72  ion TM");..  btr
1ef30 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1ef40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1ef50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ef60 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
1ef70 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
1ef80 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1ef90 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
1efa0 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
1efb0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
1efc0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1efd0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1efe0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1eff0 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
1f000 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
1f010 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
1f020 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1f030 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
1f040 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1f050 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
1f060 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
1f070 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
1f080 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
1f090 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
1f0a0 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
1f0b0 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
1f0c0 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
1f0d0 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
1f0e0 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
1f0f0 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
1f100 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
1f110 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
1f120 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
1f130 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
1f140 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
1f150 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
1f160 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
1f170 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
1f180 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
1f190 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1f1a0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1f1b0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
1f1c0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
1f1d0 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
1f1e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
1f1f0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
1f200 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1f210 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
1f220 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1f230 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
1f240 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
1f250 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
1f260 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
1f270 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
1f280 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
1f290 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
1f2a0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
1f2b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1f2c0 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1f2d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1f2e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
1f2f0 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
1f300 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
1f310 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
1f320 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
1f330 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
1f340 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
1f350 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
1f360 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
1f370 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
1f380 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
1f390 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
1f3a0 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
1f3b0 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
1f3c0 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
1f3d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
1f3e0 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
1f3f0 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
1f400 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
1f410 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
1f420 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
1f430 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
1f440 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1f450 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1f460 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1f470 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1f480 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1f490 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1f4a0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1f4b0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1f4c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f4d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1f4e0 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
1f4f0 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
1f500 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1f510 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
1f520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
1f530 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f540 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1f550 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1f560 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1f570 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
1f580 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
1f590 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
1f5a0 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
1f5b0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
1f5c0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1f5d0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
1f5e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1f5f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f600 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
1f610 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1f620 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1f630 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1f640 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1f650 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
1f660 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
1f670 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
1f680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f690 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1f6a0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
1f6b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f6c0 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
1f6d0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
1f6e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f6f0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
1f700 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f710 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
1f720 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
1f730 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
1f740 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
1f750 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1f760 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1f770 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1f780 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1f790 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f7a0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1f7b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1f7c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1f7d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
1f7f0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
1f800 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
1f810 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
1f820 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1f830 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1f840 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1f850 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1f860 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
1f870 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1f880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f890 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f8a0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1f8b0 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
1f8c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1f8d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1f8e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1f8f0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1f900 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1f910 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1f920 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1f930 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
1f940 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
1f950 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1f960 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1f970 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
1f980 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
1f990 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
1f9a0 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
1f9b0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
1f9c0 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
1f9d0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
1f9e0 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
1f9f0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
1fa00 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
1fa10 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
1fa20 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1fa30 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1fa40 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1fa50 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
1fa60 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
1fa70 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
1fa80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fa90 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
1faa0 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
1fab0 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
1fac0 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
1fad0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
1fae0 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
1faf0 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
1fb00 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
1fb10 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
1fb20 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
1fb30 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
1fb40 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
1fb50 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
1fb60 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
1fb70 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
1fb80 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
1fb90 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
1fba0 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
1fbb0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
1fbc0 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
1fbd0 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
1fbe0 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
1fbf0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1fc00 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
1fc10 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
1fc20 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
1fc30 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
1fc40 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1fc50 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
1fc60 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
1fc70 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
1fc80 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
1fc90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
1fca0 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
1fcb0 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
1fcc0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1fcd0 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
1fce0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
1fcf0 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
1fd00 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
1fd10 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
1fd20 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
1fd30 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
1fd40 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
1fd50 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fd60 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
1fd70 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
1fd80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
1fd90 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
1fda0 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
1fdb0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1fdc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1fdd0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1fde0 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
1fdf0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
1fe00 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
1fe10 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1fe20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fe30 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
1fe40 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
1fe50 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
1fe60 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
1fe70 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
1fe80 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
1fe90 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1fea0 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
1feb0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1fec0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1fed0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
1fee0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
1fef0 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
1ff00 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
1ff10 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
1ff20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
1ff30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1ff40 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
1ff50 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
1ff60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1ff70 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
1ff80 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
1ff90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ffa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ffb0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
1ffc0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1ffd0 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
1ffe0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1fff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20000 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20020 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
20030 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
20040 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
20050 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
20060 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
20070 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
20080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
20090 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
200a0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
200b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
200c0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
200d0 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
200e0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
200f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20100 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
20110 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
20120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
20130 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
20140 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
20150 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
20160 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
20170 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
20180 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
20190 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
201a0 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
201b0 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
201c0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
201d0 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
201e0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
201f0 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
20200 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
20210 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
20220 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
20230 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
20240 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
20250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
20260 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
20270 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
20280 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
20290 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
202a0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
202b0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
202c0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
202d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
202e0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
202f0 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
20300 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
20310 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
20320 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20330 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
20340 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
20350 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
20360 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
20370 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
20380 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
20390 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
203a0 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
203b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
203c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
203d0 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
203e0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
203f0 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
20400 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
20410 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
20420 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
20430 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
20440 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
20450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
20460 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
20470 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
20480 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20490 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
204a0 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
204b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
204c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
204d0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
204e0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
204f0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
20500 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
20510 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
20520 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
20530 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
20540 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
20550 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
20560 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
20570 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
20580 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
20590 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
205a0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
205b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
205c0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
205d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
205e0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
205f0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
20600 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
20610 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
20620 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
20630 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
20640 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
20650 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
20660 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
20670 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
20680 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
20690 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
206a0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
206b0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
206c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
206d0 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
206e0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
206f0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
20700 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
20710 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
20720 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
20730 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
20740 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
20750 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
20760 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
20770 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
20780 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
20790 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
207a0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
207b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
207c0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
207d0 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
207e0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
207f0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20800 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
20810 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
20820 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
20830 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
20840 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20850 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20870 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
20880 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
20890 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
208a0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
208b0 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
208c0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
208d0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
208e0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
208f0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
20900 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
20910 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
20920 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
20930 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
20940 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
20950 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
20960 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
20970 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
20980 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
20990 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
209a0 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
209b0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
209c0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
209d0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
209e0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
209f0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
20a00 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
20a10 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
20a20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
20a30 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
20a40 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
20a50 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
20a60 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
20a70 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
20a80 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
20a90 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
20aa0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
20ab0 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
20ac0 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
20ad0 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
20ae0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
20af0 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
20b00 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
20b10 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
20b20 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
20b30 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
20b40 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
20b50 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
20b60 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
20b70 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
20b80 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
20b90 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
20ba0 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
20bb0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
20bc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
20bd0 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
20be0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
20bf0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
20c00 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
20c10 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
20c20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
20c30 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
20c40 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
20c50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20c60 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
20c70 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
20c80 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
20c90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20ca0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
20cb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
20cd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20ce0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
20cf0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
20d00 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
20d10 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
20d20 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
20d30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
20d40 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
20d50 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
20d60 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
20d70 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
20d80 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
20d90 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
20da0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
20db0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
20dc0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
20dd0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
20de0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
20df0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
20e00 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
20e10 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
20e20 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
20e30 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
20e40 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
20e50 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
20e60 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
20e70 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
20e80 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
20e90 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
20ea0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
20eb0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
20ec0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
20ed0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
20ee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20ef0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20f00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
20f10 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20f20 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20f30 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
20f40 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
20f50 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
20f60 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
20f70 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
20f80 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
20f90 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
20fa0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
20fb0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
20fc0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
20fd0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
20fe0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
20ff0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
21000 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
21010 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
21020 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
21030 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
21040 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
21050 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
21060 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
21070 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
21080 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
21090 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
210a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
210b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
210c0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
210d0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
210e0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
210f0 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
21100 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
21110 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
21120 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
21130 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
21140 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
21150 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
21160 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
21170 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
21180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
21190 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
211a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
211b0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
211c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
211d0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
211e0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
211f0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
21200 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
21210 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
21220 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
21230 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
21240 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
21250 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
21260 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21270 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21280 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
21290 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
212a0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
212b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
212c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
212d0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
212e0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
212f0 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
21300 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
21310 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
21320 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
21330 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
21340 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
21350 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
21360 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
21370 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
21380 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
21390 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
213a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
213b0 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
213c0 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
213d0 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
213e0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
213f0 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
21400 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
21410 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
21420 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
21430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
21440 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
21450 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
21460 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21470 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21480 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
21490 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
214a0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
214b0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
214c0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
214d0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
214e0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
214f0 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
21500 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
21510 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
21520 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
21530 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
21540 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
21550 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
21560 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
21570 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21580 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
21590 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
215a0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
215b0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
215c0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
215d0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
215e0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
215f0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21600 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
21610 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
21620 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
21630 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
21640 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
21650 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
21660 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
21670 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
21680 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
21690 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
216a0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
216b0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
216c0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
216d0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
216e0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
216f0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
21700 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
21710 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
21720 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21730 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
21740 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
21750 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
21760 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
21770 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
21780 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
21790 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
217a0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
217b0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
217c0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
217d0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
217e0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
217f0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
21800 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
21810 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
21820 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
21830 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
21840 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21850 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
21860 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
21870 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
21880 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
21890 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
218a0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
218b0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
218c0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
218d0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
218e0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
218f0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
21900 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
21910 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
21920 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
21930 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
21940 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
21950 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
21960 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
21970 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
21980 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
21990 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
219a0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
219b0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
219c0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
219d0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
219e0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
219f0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
21a00 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
21a10 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21a40 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
21a50 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
21a80 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
21a90 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
21aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ac0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
21ad0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
21ae0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
21af0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
21b00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
21b10 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
21b20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
21b30 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
21b60 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
21b70 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
21b80 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
21b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
21ba0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
21bb0 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  le */.  BtCursor
21bc0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21be0 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f  * Looping over o
21bf0 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73  ther all cursors
21c00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
21c10 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
21c20 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
21c30 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
21c40 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
21c50 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
21c60 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
21c70 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
21c80 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
21c90 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
21ca0 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
21cb0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
21cc0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
21cd0 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
21ce0 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
21cf0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
21d00 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
21d10 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
21d20 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
21d30 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
21d40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
21d50 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
21d60 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
21d70 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
21d80 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
21d90 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
21da0 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
21db0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
21dc0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
21dd0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
21de0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
21df0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
21e00 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
21e10 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
21e20 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
21e30 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
21e40 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
21e50 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
21e60 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
21e70 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
21e80 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
21e90 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
21ea0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21eb0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
21ec0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72  ==0 );..  if( wr
21ed0 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
21ee0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
21ef0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
21f00 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
21f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
21f20 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
21f30 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
21f40 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
21f50 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
21f60 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
21f70 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
21f80 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
21f90 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
21fa0 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
21fb0 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
21fc0 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
21fd0 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
21fe0 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
21ff0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
22000 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
22010 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
22020 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
22030 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
22040 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
22050 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
22060 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
22070 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
22080 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72  Bt;.  assert( wr
22090 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
220a0 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61  g==BTCF_WriteFla
220b0 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  g );.  pCur->cur
220c0 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a  Flags = wrFlag;.
220d0 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
220e0 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
220f0 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
22100 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
22110 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
22120 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
22130 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
22140 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
22150 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
22160 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
22170 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
22180 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
22190 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
221a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
221b0 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
221c0 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
221d0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
221e0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
221f0 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
22200 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
22210 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
22220 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
22230 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
22240 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
22250 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
22260 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
22270 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
22280 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
22290 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
222a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
222b0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
222f0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22320 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
22330 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
22340 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22370 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
22380 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
22390 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
223a0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
223b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
223c0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
223d0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
223e0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22400 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
22410 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
22420 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
22430 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
22440 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22450 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22460 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
22470 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
22480 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
22490 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
224a0 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
224b0 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
224c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
224d0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
224e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
224f0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
22500 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
22510 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
22520 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
22530 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
22540 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
22550 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
22560 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
22570 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
22580 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
22590 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
225a0 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
225b0 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
225c0 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
225d0 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
225e0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
225f0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
22600 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
22610 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
22620 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
22630 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
22640 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
22650 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
22660 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
22670 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
22680 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
22690 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
226a0 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
226b0 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
226c0 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
226d0 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
226e0 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
226f0 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
22700 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
22710 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
22720 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
22730 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
22740 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
22750 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
22760 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
22770 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
22780 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
22790 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
227a0 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
227b0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
227c0 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
227d0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
227e0 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
227f0 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
22800 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
22810 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
22820 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22830 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
22840 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
22850 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
22860 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
22870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
22880 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
22890 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
228a0 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
228b0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
228c0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
228d0 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
228e0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
228f0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
22900 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
22910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
22920 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
22930 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
22940 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
22950 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
22960 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
22970 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
22980 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
22990 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
229a0 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
229b0 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
229c0 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
229d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
229e0 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
229f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
22a00 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
22a10 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
22a20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22a30 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
22a40 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
22a50 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
22a60 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
22a70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
22a80 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
22a90 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
22aa0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
22ab0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
22ac0 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
22ad0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
22ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22af0 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
22b00 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
22b10 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
22b20 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
22b30 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
22b40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
22b50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22b60 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
22b70 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
22b80 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
22b90 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
22ba0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
22bb0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
22bc0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
22bd0 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
22be0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
22bf0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
22c00 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
22c10 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
22c20 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
22c30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
22c40 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
22c50 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
22c60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
22c70 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
22c80 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
22c90 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
22ca0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
22cb0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
22cc0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
22cd0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
22ce0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
22cf0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
22d00 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
22d10 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
22d20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
22d30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
22d40 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
22d50 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
22d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
22d70 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
22d80 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
22d90 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
22da0 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
22db0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
22dc0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
22dd0 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
22de0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
22df0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
22e00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22e10 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
22e20 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
22e30 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
22e40 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43  r->iPage;.    pC
22e50 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
22e60 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
22e70 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
22e80 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
22e90 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
22ea0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
22eb0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
22ec0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
22ed0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
22ee0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
22ef0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
22f00 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
22f10 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
22f20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
22f30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
22f40 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
22f50 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
22f60 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
22f70 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
22f80 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
22f90 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
22fa0 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
22fb0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
22fc0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
22fd0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
22fe0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
22ff0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
23000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23010 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
23020 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
23030 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
23040 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
23050 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
23060 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
23070 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
23080 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
23090 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
230a0 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
230b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
230c0 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
230d0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
230e0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
230f0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
23100 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
23110 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
23120 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
23130 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
23140 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
23150 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
23160 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
23170 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
23180 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
23190 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
231a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
231b0 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
231c0 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
231d0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
231e0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
231f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
23200 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
23210 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
23220 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
23230 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
23240 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
23250 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
23260 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
23270 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23280 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23290 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
232a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
232b0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
232c0 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
232d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
232e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
232f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
23300 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
23310 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23320 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
23330 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
23340 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
23350 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  nts to..**.** Th
23360 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
23370 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
23380 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
23390 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
233a0 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
233b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
233c0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
233d0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
233e0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
233f0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
23400 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
23410 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
23420 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
23430 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73   possible.  This
23440 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
23450 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
23460 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  OK..** It might 
23470 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20  just as well be 
23480 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74  a procedure (ret
23490 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74  urning void) but
234a0 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   we continue.** 
234b0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  to return an int
234c0 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65  eger result code
234d0 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
234e0 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  reasons..*/.int 
234f0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
23500 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
23510 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
23520 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
23530 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23540 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23550 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23560 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23570 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23580 61 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  age>=0 );.  asse
23590 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
235a0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
235b0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
235c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
235d0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65  r->iPage]->intKe
235e0 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65  yLeaf==1 );.  ge
235f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23600 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
23610 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
23620 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23630 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  _OK;.}../*.** Gi
23640 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
23650 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
23660 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
23670 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
23680 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
23690 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
236a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
236b0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
236c0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
236d0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
236e0 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
236f0 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
23700 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
23710 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
23720 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
23730 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
23740 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
23750 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
23760 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
23770 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
23780 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
23790 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
237a0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
237b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
237c0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
237d0 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
237e0 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
237f0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
23800 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
23810 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
23820 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
23830 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
23840 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
23850 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
23860 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
23870 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
23880 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
23890 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
238a0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
238b0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
238c0 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
238d0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
238e0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
238f0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
23900 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
23910 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
23920 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
23930 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
23940 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
23950 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
23960 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
23970 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
23980 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
23990 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
239a0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
239b0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
239c0 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
239d0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
239e0 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
239f0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
23a00 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
23a10 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
23a20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
23a30 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
23a40 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a60 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
23a70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
23a80 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
23a90 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
23aa0 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
23ab0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
23ac0 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
23ad0 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
23ae0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
23af0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
23b00 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
23b10 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
23b20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
23b30 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
23b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
23b50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23b60 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
23b70 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
23b80 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
23b90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23ba0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
23bb0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
23bc0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
23bd0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
23be0 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
23bf0 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
23c00 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
23c10 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
23c20 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
23c30 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
23c40 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
23c50 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
23c60 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
23c70 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
23c80 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
23c90 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
23ca0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
23cb0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
23cc0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
23cd0 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
23ce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
23cf0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
23d00 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
23d10 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
23d20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
23d30 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
23d40 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
23d50 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
23d60 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
23d70 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
23d80 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
23d90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
23da0 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
23db0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
23dc0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
23dd0 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
23de0 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
23df0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
23e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
23e10 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
23e20 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
23e30 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
23e40 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
23e50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23e60 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
23e70 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
23e80 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
23e90 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
23ea0 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
23eb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23ec0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
23ed0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
23ee0 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
23ef0 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
23f00 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
23f10 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
23f20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
23f30 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
23f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23f50 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
23f60 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
23f70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
23f80 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
23f90 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
23fa0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
23fb0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
23fc0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
23fd0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
23fe0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
23ff0 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
24000 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
24010 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
24020 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
24030 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
24040 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
24050 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
24060 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
24070 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
24080 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
24090 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
240a0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
240b0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
240c0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
240d0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
240e0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
240f0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
24100 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
24110 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
24120 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
24130 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
24140 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
24150 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
24160 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
24170 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
24180 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
24190 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
241a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
241b0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
241c0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
241d0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
241e0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
241f0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
24200 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
24210 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
24220 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
24230 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
24240 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
24250 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
24260 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
24270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24280 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
24290 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
242a0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
242b0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
242c0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
242d0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
242e0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
242f0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
24300 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
24310 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
24320 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
24330 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
24340 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
24350 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
24360 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
24370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24380 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
24390 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
243a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
243b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
243c0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
243d0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
243e0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
243f0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24400 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
24410 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
24420 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
24430 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
24440 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
24450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24460 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
24470 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
24480 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
24490 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
244a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
244b0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
244c0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
244d0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
244e0 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
244f0 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
24500 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
24510 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
24520 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
24530 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
24540 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24550 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
24560 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
24570 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
24580 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
24590 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65  .**   2: The ope
245a0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
245b0 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74  . Do not populat
245c0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
245d0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
245e0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
245f0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
24600 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
24610 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
24620 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
24630 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
24640 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
24650 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
24660 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
24670 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
24680 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
24690 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
246a0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
246b0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
246c0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
246d0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
246e0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
246f0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
24700 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ages and the.** 
24710 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  eOp argument is 
24720 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63  not 2, this func
24730 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
24740 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
24750 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c  lazily .** popul
24760 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
24770 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24780 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
24790 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
247a0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
247b0 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
247c0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
247d0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
247e0 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
247f0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
24800 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
24810 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
24820 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
24830 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
24840 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
24850 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
24860 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
24870 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
24880 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
24890 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
248a0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
248b0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
248c0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
248d0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
248e0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
248f0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
24900 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
24910 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
24920 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
24930 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
24940 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
24950 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
24960 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
24970 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
24980 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
24990 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
249a0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
249b0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
249c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
249d0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
249e0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
249f0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
24a00 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
24a10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
24a20 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
24a30 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
24a40 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
24a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24a60 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
24a70 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
24a80 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
24a90 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
24aa0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
24ab0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ad0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
24ae0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
24af0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
24b00 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
24b10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24b20 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
24b30 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
24b40 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
24b50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24b60 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
24b70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
24b80 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
24b90 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
24ba0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
24bb0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
24bc0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
24bd0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
24be0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
24bf0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
24c00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
24c10 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
24c20 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64  pBuf;.  int bEnd
24c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
24c60 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64  ding to end of d
24c70 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ata */.#endif.. 
24c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
24c90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24ca0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24cb0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
24cc0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
24cd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
24ce0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
24cf0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24d00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24d10 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d  .  assert( eOp!=
24d20 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29  2 || offset==0 )
24d30 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73  ;    /* Always s
24d40 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e  tart from beginn
24d50 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a  ing for eOp==2 *
24d60 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  /..  getCellInfo
24d70 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
24d80 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
24d90 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66  pPayload;.#ifdef
24da0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
24db0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62  VERFLOW_READ.  b
24dc0 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74  End = offset+amt
24dd0 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  ==pCur->info.nPa
24de0 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20  yload;.#endif.  
24df0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
24e00 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
24e10 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
24e20 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43  if( &aPayload[pC
24e30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
24e40 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
24e50 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
24e60 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ] ){.    /* Tryi
24e70 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
24e80 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
24e90 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
24ea0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
24eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
24ec0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
24ed0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
24ee0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
24ef0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
24f00 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
24f10 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
24f20 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
24f30 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
24f40 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
24f50 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
24f60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
24f70 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
24f80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
24f90 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
24fa0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
24fb0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
24fc0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
24fd0 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
24fe0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
24ff0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
25000 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
25010 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
25020 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
25030 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
25040 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
25050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25060 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
25070 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
25080 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
25090 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
250a0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
250b0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
250c0 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
250d0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
250e0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
250f0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
25100 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
25110 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
25120 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
25130 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
25140 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
25150 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63   now..    ** Exc
25160 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ept, do not allo
25170 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d  cate aOverflow[]
25180 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20   for eOp==2..   
25190 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
251a0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
251b0 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
251c0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
251d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
251e0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
251f0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
25200 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25210 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
25220 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
25230 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
25240 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
25250 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
25260 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
25270 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
25280 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
25290 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
252a0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
252b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
252c0 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72   eOp!=2 && (pCur
252d0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
252e0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
252f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
25300 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
25310 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
25320 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
25330 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
25340 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
25350 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
25360 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
25370 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
25380 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
25390 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
253a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
253b0 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
253c0 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
253d0 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
253e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
253f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25400 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  M;.        }else
25410 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
25420 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e  ->nOvflAlloc = n
25430 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20  Ovfl*2;.        
25440 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
25450 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  w = aNew;.      
25460 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  _OK ){.        m
25490 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
254a0 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
254b0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
254c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
254d0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
254e0 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d  lidOvfl;.      }
254f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
25500 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
25510 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
25520 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
25530 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  d and the.    **
25540 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
25550 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
25560 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
25570 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a  alid, skip.    *
25580 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
25590 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
255a0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
255b0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
255c0 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43  l)!=0.     && pC
255d0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
255e0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20  fset/ovflSize]. 
255f0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78     ){.      iIdx
25600 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
25610 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
25620 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
25630 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
25640 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
25650 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
25660 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20      }..    for( 
25670 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
25680 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
25690 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
256a0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
256b0 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
256c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
256d0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
256e0 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
256f0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
25700 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29  _ValidOvfl)!=0 )
25710 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
25720 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
25730 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
25740 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
25750 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
25760 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
25770 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
25780 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPage;.      }..
25790 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
257a0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
257b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
257c0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
257d0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
257e0 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
257f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
25800 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
25810 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
25820 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
25830 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
25840 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
25850 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
25860 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
25870 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
25880 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
25890 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
258a0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
258b0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
258c0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
258d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
258e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
258f0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
25900 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
25910 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
25920 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d  ed because eOp!=
25930 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72  2.        ** her
25940 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74  e.  If eOp==2, t
25950 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e  hen offset==0 an
25960 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73  d this branch is
25970 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20   never taken..  
25980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25990 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
259a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
259b0 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  t( pCur->curFlag
259c0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
259d0 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  fl );.        as
259e0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72  sert( pCur->pBtr
259f0 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20  ee->db==pBt->db 
25a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25a10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
25a20 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
25a30 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
25a40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
25a50 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
25a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25a70 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
25a80 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
25a90 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
25aa0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
25ab0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
25ac0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
25ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
25ae0 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
25af0 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
25b00 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
25b10 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
25b20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
25b30 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
25b40 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
25b50 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
25b60 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
25b70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
25b80 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
25b90 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  AD.        sqlit
25ba0 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e  e3_file *fd;.#en
25bb0 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dif.        int 
25bc0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
25bd0 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
25be0 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
25bf0 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
25c00 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
25c10 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66         }..#ifdef
25c20 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
25c30 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
25c40 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74       /* If all t
25c50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
25c60 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a   true:.        *
25c70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31  *.        **   1
25c80 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  ) this is a read
25c90 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20   operation, and 
25ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29  .        **   2)
25cb0 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65   data is require
25cc0 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  d from the start
25cd0 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   of this overflo
25ce0 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20  w page, and.    
25cf0 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20      **   3) the 
25d00 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
25d10 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
25d20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
25d30 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72  re is no open wr
25d40 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
25d50 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
25d60 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73    5) the databas
25d70 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64  e is not a WAL d
25d80 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20  atabase,.       
25d90 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74   **   6) all dat
25da0 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  a from the page 
25db0 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20  is being read.. 
25dc0 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61         **   7) a
25dd0 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
25de0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
25df0 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
25e00 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
25e10 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
25e20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
25e30 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
25e40 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
25e50 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
25e60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
25e70 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
25e80 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
25e90 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
25ea0 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
25eb0 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
25ec0 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
25ed0 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
25ee0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
25ef0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25f00 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78       if( (eOp&0x
25f10 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  01)==0          
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
25f40 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
25f50 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
25f90 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64          && (bEnd
25fa0 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29   || a==ovflSize)
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fd0 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
25fe0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
25ff0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45  action==TRANS_RE
26000 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AD              
26010 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f         /* (4) */
26020 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64  .         && (fd
26030 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
26040 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
26050 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20  )->pMethods     
26060 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
26070 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65     && pBt->pPage
26080 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78  1->aData[19]==0x
26090 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  01              
260a0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20           /* (5) 
260b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26  */.         && &
260c0 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74  pBuf[-4]>=pBufSt
260d0 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20  art             
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20    /* (7) */.    
26100 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26110 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
26120 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
26130 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
26140 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26150 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74  ( aWrite>=pBufSt
26160 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20  art );          
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26180 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20  * hence (7) */. 
26190 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
261a0 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
261b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
261c0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
261d0 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
261e0 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
261f0 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
26200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
26210 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
26220 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
26230 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
26240 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
26250 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
26260 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
26270 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
26280 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
26290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
262a0 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
262b0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
262c0 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20  e, &pDbPage,.   
262d0 20 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70             ((eOp
262e0 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45  &0x01)==0 ? PAGE
262f0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
26300 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
26310 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26330 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
26340 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
26350 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
26360 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
26370 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
26380 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
26390 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
263a0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
263b0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
263c0 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26  , pBuf, a, (eOp&
263d0 30 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b  0x01), pDbPage);
263e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
263f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
26400 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
26410 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
26420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
26440 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
26450 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
26460 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
26470 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26480 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
26490 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
264a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
264b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
264c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
264d0 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
264e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
264f0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
26500 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
26510 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
26520 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
26530 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
26540 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
26550 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54  offset"..**.** T
26560 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
26570 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
26580 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
26590 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e   valid row.** in
265a0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
265b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
265c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
265d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
265e0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
265f0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
26600 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
26610 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
26620 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
26630 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
26640 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
26650 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
26660 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26670 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
26680 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
26690 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
266a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
266b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
266c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
266d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
266e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
266f0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
26700 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26710 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
26720 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26730 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
26740 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26750 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
26760 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
26770 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
26780 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
26790 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
267a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
267b0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
267c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
267d0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
267e0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
267f0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
26800 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
26810 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
26820 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
26830 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
26840 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26850 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
26860 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
26870 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
26880 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
26890 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
268a0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
268b0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
268c0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
268d0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
268e0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
268f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26900 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
26910 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
26920 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
26930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26940 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
26950 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26960 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
26970 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26980 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
26990 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
269a0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
269b0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
269c0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
269d0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
269e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
269f0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
26a00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26a10 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26a20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26a30 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
26a40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26a50 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73  iPage] );.    as
26a60 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
26a70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
26a80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26a90 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
26aa0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
26ab0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
26ac0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
26ad0 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
26ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26af0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
26b00 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
26b10 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
26b20 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
26b30 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
26b40 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
26b50 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
26b60 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
26b70 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
26b80 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
26b90 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
26ba0 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
26bb0 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
26bc0 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
26bd0 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
26be0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
26bf0 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
26c00 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
26c10 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
26c20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
26c30 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
26c40 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
26c50 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
26c60 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
26c70 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
26c80 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
26c90 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
26ca0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
26cb0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
26cc0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
26cd0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
26ce0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
26cf0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
26d00 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
26d10 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
26d20 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
26d30 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
26d40 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
26d50 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
26d60 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
26d70 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
26d80 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
26d90 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
26da0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
26db0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
26dc0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
26dd0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
26de0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
26df0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
26e00 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
26e10 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
26e20 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
26e30 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
26e40 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
26e50 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
26e60 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
26e70 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
26e80 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
26e90 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
26ea0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
26eb0 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
26ec0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
26ed0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
26ee0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
26ef0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
26f00 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
26f10 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
26f20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
26f30 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
26f40 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
26f50 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  here */.){.  u32
26f60 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
26f70 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
26f80 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
26f90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26fa0 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
26fb0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
26fc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
26fd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26fe0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
26ff0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
27000 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
27010 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27020 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27030 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27040 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27050 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27060 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27070 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
27080 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
27090 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
270a0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
270b0 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad>pCur->apPage[
270c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
270d0 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
270e0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
270f0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27100 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad<pCur->apPage[
27110 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27120 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54  ataEnd ||CORRUPT
27130 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69  _DB);.  amt = (i
27140 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65  nt)(pCur->apPage
27150 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27160 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
27170 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a  info.pPayload);.
27180 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
27190 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d  .nLocal<amt ) am
271a0 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
271b0 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d  Local;.  *pAmt =
271c0 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28   amt;.  return (
271d0 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
271e0 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
271f0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
27200 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
27210 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
27220 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
27230 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
27240 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
27250 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
27260 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
27270 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
27280 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27290 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
272a0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
272b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
272c0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
272d0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
272e0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
272f0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
27300 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
27310 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
27320 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
27330 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
27340 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
27350 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
27360 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
27370 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
27380 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
27390 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
273a0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
273b0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
273c0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
273d0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
273e0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
273f0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
27400 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
27410 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
27420 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
27430 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
27440 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
27450 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
27460 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
27470 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
27480 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
27490 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
274a0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
274b0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
274c0 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
274d0 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
274e0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
274f0 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  mt);.}.../*.** M
27500 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
27510 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
27520 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
27530 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
27540 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
27550 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
27560 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
27570 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
27580 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
27590 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
275a0 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
275b0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
275c0 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
275d0 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
275e0 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
275f0 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
27600 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
27610 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
27620 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
27630 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
27640 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
27650 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
27660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
27670 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
27680 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
27690 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72  wPgno){.  BtShar
276a0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
276b0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
276c0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
276d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
276e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
276f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27710 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
27720 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
27730 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
27740 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  age>=0 );.  if( 
27750 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
27760 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
27770 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
27780 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27790 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75  _BKPT;.  }.  pCu
277a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
277b0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
277c0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
277d0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
277e0 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
277f0 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72  >iPage++;.  pCur
27800 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27810 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  age] = 0;.  retu
27820 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  rn getAndInitPag
27830 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
27840 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  &pCur->apPage[pC
27850 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27870 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e      pCur, pCur->
27880 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
27890 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
278a0 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
278b0 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
278c0 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
278d0 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
278e0 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
278f0 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
27900 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
27910 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
27920 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
27930 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
27940 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
27950 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
27960 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
27970 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
27980 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
27990 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
279a0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
279b0 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
279c0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
279d0 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
279e0 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
279f0 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
27a00 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
27a10 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
27a20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
27a30 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73  e conditions tes
27a40 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20  ted below might 
27a50 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20  not be true.    
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a70 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20          ** in a 
27a80 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
27a90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49   */.  assert( iI
27aa0 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
27ab0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
27ac0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
27ad0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27ae0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
27af0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
27b00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
27b10 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
27b20 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
27b30 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
27b40 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
27b50 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
27b60 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
27b70 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
27b80 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
27b90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
27ba0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
27bb0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
27bc0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
27bd0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
27be0 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
27bf0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
27c00 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
27c10 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
27c20 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
27c30 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
27c40 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
27c50 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
27c60 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
27c70 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
27c80 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
27c90 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
27ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
27cb0 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
27cc0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
27cd0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27ce0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27cf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27d00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27d10 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
27d20 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
27d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27d40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27d50 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
27d60 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
27d70 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
27d80 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
27d90 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
27da0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
27db0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
27dc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27dd0 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74  pgno.  );.  test
27de0 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
27df0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
27e00 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
27e10 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
27e20 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d  nCell );.  pCur-
27e30 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
27e40 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
27e50 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
27e60 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
27e70 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65  Ovfl);.  release
27e80 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
27e90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27ea0 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  Page--]);.}../*.
27eb0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
27ec0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
27ed0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
27ee0 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
27ef0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
27f00 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
27f10 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
27f20 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
27f30 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
27f40 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
27f50 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
27f60 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
27f70 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
27f80 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
27f90 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
27fa0 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
27fb0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
27fc0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
27fd0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
27fe0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
27ff0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
28000 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
28010 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
28020 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
28030 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
28040 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
28050 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
28060 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
28070 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
28080 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
28090 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
280a0 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
280b0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
280c0 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
280d0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
280e0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
280f0 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
28100 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
28110 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
28120 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
28130 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
28140 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
28150 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
28160 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
28170 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
28180 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
28190 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
281a0 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
281b0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
281c0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
281d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
281e0 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
281f0 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
28200 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
28210 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
28220 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
28230 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
28240 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
28250 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
28260 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
28270 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
28280 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
28290 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
282a0 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
282b0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
282c0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
282d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
282e0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
282f0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
28300 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
28310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28320 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28330 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28340 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28350 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
28360 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28370 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
28380 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
28390 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
283a0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
283b0 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
283c0 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
283d0 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
283e0 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
283f0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
28400 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
28410 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28420 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61  FAULT ){.      a
28430 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
28440 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
28450 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
28460 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
28470 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28480 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
28490 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20  or(pCur);.  }.. 
284a0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
284b0 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  >=0 ){.    while
284c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b  ( pCur->iPage ){
284d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
284e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
284f0 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20  ->iPage]!=0 );. 
28500 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
28510 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
28520 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28530 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  --]);.    }.  }e
28540 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
28550 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
28560 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28570 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28590 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
285a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
285b0 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a  >iPage==(-1) );.
285c0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
285d0 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
285e0 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
285f0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
28600 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20  ->apPage[0],.   
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75       0, pCur->cu
28630 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20  rPagerFlags);.  
28640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
28660 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
28670 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
28680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28690 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
286a0 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ge = 0;.    pCur
286b0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43  ->curIntKey = pC
286c0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
286d0 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
286e0 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
286f0 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
28700 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
28710 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
28720 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
28730 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
28740 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
28750 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
28760 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
28770 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
28780 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
28790 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
287a0 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
287b0 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
287c0 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
287d0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
287e0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
287f0 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
28800 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
28810 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
28820 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
28830 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
28840 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
28850 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
28860 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
28870 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
28880 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
28890 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
288a0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
288b0 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
288c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
288d0 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
288e0 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
288f0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
28900 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
28910 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
28920 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
28930 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
28940 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
28950 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
28960 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
28970 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
28980 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
28990 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
289a0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
289b0 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
289c0 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
289d0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
289e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
289f0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
28a00 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
28a10 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
28a20 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28a30 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28a40 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
28a50 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
28a60 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
28a70 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
28a80 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
28a90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
28aa0 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
28ab0 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
28ac0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
28ad0 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
28ae0 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
28af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28b00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
28b10 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
28b20 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
28b30 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
28b40 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
28b50 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28b60 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
28b70 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
28b80 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
28b90 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
28ba0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
28bb0 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65  NVALID;.  }.  re
28bc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28bd0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
28be0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
28bf0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
28c00 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
28c10 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
28c20 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
28c30 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
28c40 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
28c50 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
28c60 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
28c70 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
28c80 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
28c90 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
28ca0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
28cb0 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
28cc0 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
28cd0 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
28ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
28cf0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
28d00 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
28d10 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
28d20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28d30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
28d40 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
28d50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28d60 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
28d70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28d80 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
28d90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28da0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28db0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
28dc0 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
28dd0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
28de0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
28df0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28e00 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
28e10 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
28e20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
28e30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28e40 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
28e50 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
28e60 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
28e70 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
28e80 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
28e90 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
28ea0 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
28eb0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
28ec0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
28ed0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
28ee0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
28ef0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
28f00 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
28f10 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
28f20 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
28f30 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
28f40 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
28f50 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
28f60 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
28f70 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
28f80 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
28f90 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
28fa0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
28fb0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
28fc0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
28fd0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
28fe0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
28ff0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
29000 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
29010 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
29020 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29030 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
29040 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
29050 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
29060 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
29070 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29080 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29090 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
290a0 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
290b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
290c0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
290d0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
290e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
290f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
29100 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
29110 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29120 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
29130 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
29140 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
29150 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
29160 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29170 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
29180 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
29190 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
291a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
291b0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
291c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
291d0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
291e0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
291f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29200 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
29210 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
29220 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
29230 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
29240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
29250 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
29260 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
29270 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
29280 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
29290 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
292a0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
292b0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
292c0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
292d0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
292e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
292f0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
29300 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
29310 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
29320 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29330 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29340 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
29350 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
29360 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
29370 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
29380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29390 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
293a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
293b0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
293c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
293d0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
293e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
293f0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
29400 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29410 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
29420 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29430 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29440 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
29450 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29460 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
29470 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29480 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
29490 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
294a0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
294b0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
294c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
294d0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
294e0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
294f0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
29500 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
29510 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
29520 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
29530 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
29540 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
29550 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
29560 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
29570 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
29580 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
29590 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
295a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
295b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
295c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
295d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
295e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
295f0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
29600 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
29610 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
29620 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
29630 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
29640 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
29650 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
29660 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75  ate && (pCur->cu
29670 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
29680 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64  Last)!=0 ){.#ifd
29690 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
296a0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
296b0 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
296c0 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
296d0 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
296e0 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
296f0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
29700 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
29710 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
29720 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
29730 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
29740 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
29750 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
29760 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
29770 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
29780 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
29790 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
297a0 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
297b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
297c0 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
297d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
297e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
297f0 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
29800 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
29810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
29820 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
29830 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
29840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29850 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
29860 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
29870 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
29880 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
29890 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
298a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
298b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
298c0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
298d0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
298e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
298f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29900 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
29910 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
29920 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
29930 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
29940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29960 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29970 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
29980 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29990 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
299a0 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c  ags &= ~BTCF_AtL
299b0 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ast;.      }.   
299c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
299d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
299e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
299f0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
29a00 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
29a10 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
29a20 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
29a30 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
29a40 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
29a50 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
29a60 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
29a70 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
29a80 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
29a90 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
29aa0 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
29ab0 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
29ac0 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
29ad0 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
29ae0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
29af0 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
29b00 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
29b10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
29b20 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
29b30 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
29b40 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
29b50 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
29b60 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
29b70 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
29b80 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
29b90 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
29ba0 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
29bb0 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
29bc0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
29bd0 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
29be0 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
29bf0 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
29c00 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
29c10 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
29c20 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
29c30 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
29c40 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
29c50 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
29c60 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
29c70 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
29c80 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
29c90 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
29ca0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
29cb0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
29cc0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
29cf0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
29d00 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
29d10 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
29d30 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
29d40 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
29d50 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
29d60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
29d70 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
29d80 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
29d90 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
29da0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
29db0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
29dc0 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
29dd0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
29de0 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
29df0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
29e00 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
29e10 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
29e40 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
29e50 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
29e60 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
29e70 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
29e80 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
29e90 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
29ea0 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
29eb0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
29ec0 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
29ed0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
29ee0 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f00 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
29f10 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
29f20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
29f30 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
29f40 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
29f50 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
29f60 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
29f70 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
29f80 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
29f90 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
29fa0 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
29fb0 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
29fc0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
29fd0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
29fe0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29ff0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a000 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2a010 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2a020 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2a030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2a040 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2a050 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2a060 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2a070 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2a080 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2a090 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2a0a0 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2a0b0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2a0c0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2a0d0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2a0e0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
2a0f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a100 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
2a110 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2a120 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26  lidNKey)!=0.   &
2a130 26 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  & pCur->curIntKe
2a140 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
2a150 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2a160 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2a170 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2a180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a190 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2a1a0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2a1b0 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2a1c0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  !=0 && pCur->inf
2a1d0 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
2a1e0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
2a1f0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2a200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2a210 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2a220 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2a230 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2a240 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2a250 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2a260 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2a270 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2a280 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2a290 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2a2a0 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2a2b0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2a2c0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2a2d0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2a2e0 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2a2f0 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2a300 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2a310 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2a320 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2a330 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2a340 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2a350 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2a360 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2a370 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2a380 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2a390 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
2a3a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a3b0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2a3c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a3d0 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
2a3e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a3f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a400 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
2a410 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a420 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2a430 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2a440 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2a450 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
2a460 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
2a470 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a480 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2a490 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a4a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2a4b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2a4c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
2a4d0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2a4e0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2a4f0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2a500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a510 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2a520 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2a530 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2a540 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2a550 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2a560 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2a570 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2a580 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2a590 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2a5c0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2a5d0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2a5e0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2a5f0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2a600 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2a610 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2a620 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2a630 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2a640 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2a650 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2a660 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2a670 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2a680 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2a690 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2a6a0 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2a6b0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2a6c0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2a6d0 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2a6e0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2a6f0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2a700 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2a710 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2a720 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2a730 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2a740 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2a750 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2a760 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2a770 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2a780 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2a790 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2a7a0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2a7b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2a7c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2a7d0 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2a7e0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2a7f0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2a800 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2a810 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2a820 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2a830 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2a840 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2a850 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2a860 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2a870 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2a880 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a890 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2a8a0 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2a8b0 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2a8c0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2a8d0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2a8e0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2a8f0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2a900 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2a910 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2a920 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2a930 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2a940 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2a950 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2a960 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2a970 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2a980 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
2a990 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2a9a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
2a9c0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
2a9d0 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
2a9e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2a9f0 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
2aa00 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2aa10 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2aa20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2aa30 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
2aa40 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2aa50 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
2aa60 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2aa70 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2aa80 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2aa90 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
2aaa0 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2aab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2aac0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
2aad0 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
2aae0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2aaf0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
2ab00 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
2ab10 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
2ab20 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
2ab30 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2ab40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2ab50 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2ab60 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2ab70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ab80 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2ab90 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
2aba0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
2abb0 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
2abc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2abd0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2abe0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2abf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2ac00 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2ac10 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2ac20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ac30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ac40 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2ac50 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2ac60 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2ac70 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2ac80 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2ac90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2aca0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2acb0 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2acc0 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2acd0 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2ace0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2acf0 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2ad00 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2ad10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2ad20 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2ad30 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2ad40 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2ad50 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2ad60 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2ad70 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2ad80 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2ad90 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2ada0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2adb0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2adc0 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2add0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2ade0 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2adf0 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2ae00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2ae10 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2ae20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2ae30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2ae40 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2ae50 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2ae60 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2ae70 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2ae80 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2ae90 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2aea0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2aeb0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2aec0 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2aed0 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2aee0 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2aef0 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2af00 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2af10 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2af20 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2af30 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2af40 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2af50 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2af60 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2af70 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2af80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2af90 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2afa0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2afb0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2afc0 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2afd0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2afe0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2aff0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2b000 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2b010 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2b020 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2b030 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2b040 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2b050 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2b060 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b070 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2b080 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2b090 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2b0a0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2b0b0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2b0c0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2b0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2b0e0 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2b0f0 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2b100 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2b110 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2b120 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2b130 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2b140 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2b150 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2b160 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2b170 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2b180 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2b190 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2b1a0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2b1b0 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2b1c0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2b1d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b1e0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2b1f0 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2b200 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2b210 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2b220 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2b230 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2b240 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2b250 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2b260 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2b270 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2b280 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2b290 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2b2a0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2b2b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2b2c0 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2b2d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2b2e0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2b2f0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2b300 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2b310 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2b320 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2b330 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2b340 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2b350 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2b360 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2b370 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2b380 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2b390 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2b3a0 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2b3b0 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2b3c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2b3d0 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2b3e0 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2b3f0 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2b400 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2b410 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2b420 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2b430 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2b440 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2b450 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2b460 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2b470 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2b480 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2b490 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2b4a0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2b4b0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2b4c0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2b4d0 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2b4e0 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2b4f0 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2b500 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b510 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2b520 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2b530 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2b540 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2b550 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2b560 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2b570 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2b580 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2b590 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2b5a0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2b5b0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2b5c0 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2b5d0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2b5e0 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2b5f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2b600 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b610 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2b620 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2b630 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2b640 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
2b650 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2b660 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
2b670 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2b680 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
2b690 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2b6a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2b6b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2b6c0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2b6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b6e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2b6f0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2b700 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2b710 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
2b720 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
2b730 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
2b740 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29  ar*)pCellKey, 2)
2b750 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b760 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2b770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2b780 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2b790 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2b7a0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2b7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b7c0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2b7d0 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
2b7e0 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
2b7f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b800 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2b810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b820 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
2b830 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
2b840 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2b850 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
2b860 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
2b870 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2b880 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
2b890 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2b8a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
2b8b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2b8c0 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
2b8d0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2b8e0 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
2b8f0 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
2b900 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2b910 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
2b920 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2b930 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
2b940 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2b950 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2b960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b970 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2b980 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b990 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b9a0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
2b9b0 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
2b9c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2b9d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
2b9e0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2b9f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ba00 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2ba10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2ba20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2ba30 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2ba40 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2ba50 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2ba60 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20  +upr)/2 */.     
2ba70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
2ba80 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
2ba90 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
2baa0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2bab0 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
2bac0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2bad0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2bae0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2baf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2bb00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2bb10 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
2bb20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2bb30 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2bb40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2bb50 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2bb60 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2bb70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2bb80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2bb90 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2bba0 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2bbb0 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2bbc0 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2bbd0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2bbe0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2bbf0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2bc00 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2bc10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2bc20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2bc30 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2bc40 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2bc50 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
2bc60 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2bc70 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2bc80 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2bc90 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2bca0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2bcb0 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2bcc0 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2bcd0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2bce0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2bcf0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2bd00 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2bd10 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fl);.  return rc
2bd20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2bd30 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
2bd40 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2bd50 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2bd60 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
2bd70 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
2bd80 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
2bd90 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
2bda0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
2bdb0 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
2bdc0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2bdd0 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
2bde0 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
2bdf0 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
2be00 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
2be10 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
2be20 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
2be30 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2be40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
2be50 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
2be60 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2be70 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
2be80 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
2be90 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
2bea0 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
2beb0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2bec0 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
2bed0 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
2bee0 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
2bef0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
2bf00 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
2bf10 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
2bf20 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
2bf30 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
2bf40 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
2bf50 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
2bf60 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2bf70 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2bf80 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2bf90 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2bfa0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2bfb0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2bfc0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2bfd0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2bfe0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2bff0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c000 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
2c010 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
2c020 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
2c030 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
2c040 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2c050 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  is sqlite3BtreeN
2c060 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ext().  That rou
2c070 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2c080 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2c090 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2c0a0 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20  ly incrementing 
2c0b0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2c0c0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2c0d0 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  ** to the next c
2c0e0 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2c0f0 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2c100 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74  lower) btreeNext
2c110 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75  () helper.** rou
2c120 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2c130 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2c140 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2c150 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
2c160 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  or.** to restore
2c170 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2c180 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2c190 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2c1a0 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2c1b0 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2c1c0 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2c1d0 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2c1e0 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2c1f0 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2c200 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2c210 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2c220 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2c230 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2c240 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2c250 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2c260 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2c270 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2c280 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2c290 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2c2a0 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2c2b0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2c2c0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2c2d0 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2c2e0 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2c2f0 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2c300 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2c310 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2c320 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2c330 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2c340 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2c350 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2c360 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2c370 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2c380 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2c390 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2c3a0 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2c3b0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2c3c0 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
2c3d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2c3e0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2c3f0 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
2c400 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2c410 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2c420 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2c430 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2c440 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2c450 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2c460 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2c480 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  es==0 );.  if( p
2c490 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2c4a0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2c4b0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2c4c0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2c4d0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2c4e0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2c4f0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2c500 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2c510 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c520 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c530 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2c540 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2c550 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2c560 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2c570 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c580 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2c590 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2c5a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2c5b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2c5c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2c5d0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2c5e0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2c5f0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2c600 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2c610 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2c620 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2c630 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
2c640 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2c650 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2c660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c670 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2c680 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2c690 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2c6a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2c6b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2c6c0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
2c6d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2c6f0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2c700 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2c710 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2c720 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2c730 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2c740 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2c750 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2c760 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2c770 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2c780 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2c790 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2c7a0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2c7b0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2c7c0 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2c7d0 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2c7e0 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2c7f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2c800 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2c810 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2c820 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2c830 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2c840 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2c850 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2c860 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2c870 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2c880 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2c890 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2c8a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2c8b0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2c8c0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2c8d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2c8e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2c8f0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2c900 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2c910 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2c920 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2c930 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
2c940 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2c950 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2c960 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2c970 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2c980 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2c990 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
2c9a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2c9c0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2c9d0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
2c9e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c9f0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
2ca00 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2ca10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
2ca20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2ca30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2ca40 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
2ca50 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
2ca60 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2ca70 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2ca80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ca90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2caa0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2cab0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2cac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2cad0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2cae0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2caf0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
2cb00 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2cb10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2cb20 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d   int *pRes){.  M
2cb30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2cb40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2cb50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2cb60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2cb70 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2cb80 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2cb90 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2cba0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2cbb0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2cbc0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2cbd0 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  LID );.  pCur->i
2cbe0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2cbf0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2cc00 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2cc10 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2cc20 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  fl);.  *pRes = 0
2cc30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2cc40 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2cc50 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2cc60 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2cc70 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2cc80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2cc90 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b  iPage];.  if( (+
2cca0 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
2ccb0 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67  r->iPage])>=pPag
2ccc0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2ccd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2cce0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2ccf0 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2cd00 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2cd10 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2cd20 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2cd30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2cd40 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2cd50 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2cd60 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
2cd70 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
2cd80 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
2cd90 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2cda0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2cdb0 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
2cdc0 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
2cdd0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
2cde0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
2cdf0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2ce00 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
2ce10 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2ce20 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2ce30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2ce40 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2ce50 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2ce60 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2ce70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2ce80 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
2ce90 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2cea0 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2ceb0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2cec0 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
2ced0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2cee0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2cef0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2cf00 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
2cf10 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2cf20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2cf30 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
2cf40 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
2cf50 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2cf60 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2cf70 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2cf80 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2cf90 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
2cfa0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2cfb0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2cfc0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
2cfd0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
2cfe0 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
2cff0 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
2d000 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
2d010 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
2d020 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
2d030 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2d040 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
2d050 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2d060 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
2d070 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
2d080 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
2d090 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
2d0a0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
2d0b0 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
2d0c0 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
2d0d0 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
2d0e0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
2d0f0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2d100 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
2d110 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
2d120 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
2d130 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
2d140 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
2d150 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
2d160 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
2d170 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2d180 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
2d190 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
2d1a0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
2d1b0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
2d1c0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
2d1d0 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
2d1e0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2d1f0 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
2d200 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2d210 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2d220 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2d230 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2d240 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2d250 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2d260 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2d270 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2d280 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
2d290 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2d2a0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2d2b0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d2c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2d2d0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2d2e0 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2d2f0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2d300 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2d310 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2d320 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2d330 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2d340 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d350 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2d360 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2d370 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2d380 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d3a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d3b0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2d3c0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2d3d0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2d3e0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2d3f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d400 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2d410 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d420 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d430 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d440 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2d450 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2d460 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2d470 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2d480 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2d490 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2d4a0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2d4b0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2d4c0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2d4d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d4e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2d4f0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2d500 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2d510 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2d520 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d530 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2d540 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2d550 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2d560 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2d570 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
2d580 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d590 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2d5a0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2d5b0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2d5c0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2d5d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d5e0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2d5f0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2d600 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2d610 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2d620 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d630 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
2d640 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2d650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2d660 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2d670 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2d680 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2d690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d6a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2d6b0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2d6c0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2d6d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2d6e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2d6f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2d700 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2d710 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
2d720 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2d730 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
2d740 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d750 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
2d760 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d770 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d780 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2d790 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2d7a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2d7b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2d7c0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2d7d0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2d7e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2d7f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2d800 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d810 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d820 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2d830 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2d840 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
2d850 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2d860 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d870 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2d880 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2d890 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2d8a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d8b0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2d8c0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d8d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2d8e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75  *pRes = 0;.  pCu
2d8f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2d900 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2d910 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2d920 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
2d930 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2d940 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
2d950 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d960 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
2d970 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d980 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  age]==0.   || pC
2d990 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d9a0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
2d9b0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2d9c0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
2d9d0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2d9e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2d9f0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2da00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2da10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2da20 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
2da30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2da40 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
2da50 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
2da60 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
2da70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2da80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2da90 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
2daa0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
2dab0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
2dac0 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
2dad0 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
2dae0 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
2daf0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2db00 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
2db10 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
2db20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2db30 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
2db40 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
2db50 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
2db60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2db70 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
2db80 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
2db90 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
2dba0 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
2dbb0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
2dbc0 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e  NULL in the even
2dbd0 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
2dbe0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
2dbf0 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
2dc00 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e  s not 0, then an
2dc10 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
2dc20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
2dc30 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
2dc40 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
2dc50 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
2dc60 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
2dc70 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
2dc80 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
2dc90 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
2dca0 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
2dcb0 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
2dcc0 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
2dcd0 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
2dce0 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
2dcf0 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20  ** If the eMode 
2dd00 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41  parameter is BTA
2dd10 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74  LLOC_EXACT and t
2dd20 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65  he nearby page e
2dd30 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72  xists.** anywher
2dd40 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2dd50 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
2dd60 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2dd70 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a  returned.  If.**
2dd80 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2dd90 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61  C_LT then the pa
2dda0 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
2ddb0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
2ddc0 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61   equal.** to nea
2ddd0 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20  rby if any such 
2dde0 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66  page exists.  If
2ddf0 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2de00 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65  C_ANY then there
2de10 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72  .** are no restr
2de20 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68  ictions on which
2de30 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65   page is returne
2de40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2de50 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2de60 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
2de70 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
2de80 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
2de90 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
2dea0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
2deb0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
2dec0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
2ded0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
2dee0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
2def0 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
2df00 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
2df10 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
2df20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2df30 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
2df40 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
2df50 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
2df60 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
2df70 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
2df80 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
2df90 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ANY */.){.  MemP
2dfa0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
2dfb0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
2dfc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2dfd0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2dfe0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
2dff0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
2e000 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
2e010 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
2e020 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
2e030 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
2e040 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
2e050 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
2e060 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
2e070 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
2e080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e090 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
2e0a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2e0b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2e0c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  );.  assert( eMo
2e0d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20  de==BTALLOC_ANY 
2e0e0 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20  || (nearby>0 && 
2e0f0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2e100 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b  >autoVacuum)) );
2e110 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
2e120 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
2e130 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
2e140 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56  nt(pBt);.  /* EV
2e150 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31  IDENCE-OF: R-051
2e160 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62  19-02637 The 4-b
2e170 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2e180 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
2e190 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20   36.  ** stores 
2e1a0 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c  stores the total
2e1b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2e1c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2e1d0 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62  . */.  n = get4b
2e1e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2e1f0 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
2e200 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
2e210 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
2e220 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2e230 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2e240 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
2e250 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
2e260 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
2e270 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
2e280 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
2e290 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
2e2a0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
2e2b0 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
2e2c0 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
2e2d0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
2e2e0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
2e2f0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75  nearby' */.    u
2e300 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20  32 nSearch = 0; 
2e310 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68    /* Count of th
2e320 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72  e number of sear
2e330 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20  ch attempts */. 
2e340 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d     .    /* If eM
2e350 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2e360 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  CT and a query o
2e370 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
2e380 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
2e390 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
2e3a0 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
2e3b0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
2e3c0 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
2e3d0 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
2e3e0 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
2e3f0 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
2e400 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
2e410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2e420 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
2e430 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2e440 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ACT ){.      if(
2e450 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
2e460 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2e470 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ype;.        ass
2e480 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
2e490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e4a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2e4b0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2e4c0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2e4d0 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
2e4e0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2e4f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2e500 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
2e510 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
2e520 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GE ){.          
2e530 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2e540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e550 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2e560 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2e570 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63  E ){.      searc
2e580 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d  hList = 1;.    }
2e590 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2e5a0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
2e5b0 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
2e5c0 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
2e5d0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
2e5e0 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
2e5f0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2e600 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
2e610 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
2e620 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2e630 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e640 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
2e650 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2e660 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2e670 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2e680 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
2e690 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
2e6a0 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
2e6b0 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
2e6c0 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
2e6d0 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
2e6e0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
2e6f0 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
2e700 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
2e710 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
2e720 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
2e730 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
2e740 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
2e750 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2e760 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2e770 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20  XACT).    ** or 
2e780 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73  until a page les
2e790 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20  s than 'nearby' 
2e7a0 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
2e7b0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20  e==BTALLOC_LT). 
2e7c0 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
2e7d0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
2e7e0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2e7f0 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
2e800 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
2e810 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30  DENCE-OF: R-0150
2e820 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73  6-11053 The firs
2e830 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  t integer on a f
2e840 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2e850 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ge.        ** is
2e860 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2e870 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
2e880 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2e890 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a   in the list or.
2e8a0 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20          ** zero 
2e8b0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  if this is the l
2e8c0 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ast freelist tru
2e8d0 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nk page. */.    
2e8e0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2e8f0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
2e900 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
2e910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e920 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2e930 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38  F: R-59841-13798
2e940 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2e950 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2e960 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20  t offset 32.    
2e970 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68      ** stores th
2e980 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2e990 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
2e9a0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  of the freelist,
2e9b0 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20   or zero if.    
2e9c0 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c      ** the freel
2e9d0 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ist is empty. */
2e9e0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2e9f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2ea00 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2ea10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
2ea20 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
2ea30 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2ea40 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
2ea50 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e  e || nSearch++ >
2ea60 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   n ){.        rc
2ea70 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2ea80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
2ea90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2eaa0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2eab0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
2eac0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
2ead0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2eae0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
2eaf0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2eb00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2eb10 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2eb20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2eb30 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20   pTrunk!=0 );.  
2eb40 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
2eb50 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a  nk->aData!=0 );.
2eb60 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2eb70 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34  E-OF: R-13523-04
2eb80 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69  394 The second i
2eb90 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2eba0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2ebb0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2ebc0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  number of leaf p
2ebd0 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  age pointers to 
2ebe0 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  follow. */.     
2ebf0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
2ec00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2ec10 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
2ec20 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
2ec30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2ec40 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
2ec50 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
2ec60 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
2ec70 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
2ec80 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
2ec90 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2eca0 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
2ecb0 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
2ecc0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
2ecd0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
2ece0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2ecf0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
2ed00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ed10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2ed20 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2ed30 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2ed40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2ed50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2ed60 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2ed70 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
2ed80 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
2ed90 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2eda0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2edb0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2edc0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2edd0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2ede0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2edf0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70        if( pBt->p
2ee00 4c 6f 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Log ){.         
2ee10 20 73 71 6c 69 74 65 33 45 78 70 65 72 69 6d 65   sqlite3Experime
2ee20 6e 74 61 6c 4c 6f 67 28 70 42 74 2d 3e 70 4c 6f  ntalLog(pBt->pLo
2ee30 67 2c 20 22 66 72 65 65 6c 69 73 74 2d 74 72 75  g, "freelist-tru
2ee40 6e 6b 2d 61 6c 6c 6f 63 20 25 64 22 2c 20 69 54  nk-alloc %d", iT
2ee50 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  runk);.        }
2ee60 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2ee70 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2ee80 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2ee90 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2eea0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2eeb0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
2eec0 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
2eed0 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
2eee0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2eef0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
2ef00 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
2ef10 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
2ef20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ef30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ef40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ef50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
2ef60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ef70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2ef80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
2ef90 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2efa0 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
2efb0 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
2efc0 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
2efd0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2efe0 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2eff0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
2f000 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
2f010 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
2f020 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
2f030 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
2f040 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
2f050 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2f060 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
2f070 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f080 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2f090 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
2f0a0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2f0b0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2f0c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2f0d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f0e0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2f0f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2f100 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2f110 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2f120 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2f130 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2f140 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2f150 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2f160 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2f170 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2f180 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2f190 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2f1a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2f1b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2f1c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f1d0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2f1e0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2f1f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2f200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f210 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2f220 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f230 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2f240 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2f250 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
2f260 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2f270 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2f280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2f290 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2f2b0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
2f2c0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
2f2d0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
2f2e0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
2f2f0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
2f300 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
2f310 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
2f320 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
2f330 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
2f340 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2f350 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2f360 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2f370 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
2f380 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
2f390 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2f3a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
2f3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f3c0 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
2f3d0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
2f3e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f3f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2f400 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2f410 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2f420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2f440 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
2f450 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
2f460 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
2f470 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
2f480 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
2f490 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2f4a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f4b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2f4c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f4d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f4e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
2f4f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f500 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
2f510 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2f520 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f540 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f550 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2f560 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2f570 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2f580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f590 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2f5a0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2f5b0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
2f5c0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2f5d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2f5e0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2f5f0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2f600 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
2f610 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
2f620 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2f630 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
2f640 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2f650 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2f660 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f670 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2f680 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2f690 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2f6a0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2f6b0 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
2f6c0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2f6d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2f6e0 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
2f6f0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
2f700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2f710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f720 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2f730 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2f740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f760 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2f770 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2f780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f790 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2f7a0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2f7b0 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
2f7c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
2f7e0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2f7f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2f800 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
2f810 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
2f820 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
2f830 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
2f840 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
2f850 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
2f860 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
2f870 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
2f880 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
2f890 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
2f8a0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2f8b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2f8c0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
2f8d0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
2f8e0 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
2f8f0 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
2f900 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2f910 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f920 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2f930 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
2f940 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2f950 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
2f960 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
2f970 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2f980 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
2f990 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
2f9a0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
2f9b0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2f9c0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2f9d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2f9f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fa00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fa10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
2fa20 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
2fa30 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
2fa40 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2fa50 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
2fa60 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2fa70 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
2fa80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2fa90 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
2faa0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2fab0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2fac0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2fae0 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
2faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
2fb00 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
2fb10 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2fb20 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
2fb30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2fb40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2fb50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fb60 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2fb70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2fb80 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
2fb90 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2fba0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
2fbb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2fbc0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
2fbd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
2fbe0 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
2fbf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2fc00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2fc10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2fc20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fc30 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2fc40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fc50 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
2fc60 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
2fc70 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2fc80 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
2fc90 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
2fca0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
2fcb0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
2fcc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2fcd0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
2fce0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
2fcf0 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
2fd00 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2fd10 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
2fd20 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
2fd30 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
2fd40 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
2fd50 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
2fd60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2fd70 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
2fd80 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
2fd90 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
2fda0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2fdb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2fdc0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2fdd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2fde0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2fdf0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2fe00 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
2fe10 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
2fe20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2fe30 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2fe40 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
2fe50 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2fe60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
2fe70 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
2fe80 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2fe90 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
2fea0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
2feb0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
2fec0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
2fed0 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
2fee0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2fef0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
2ff00 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
2ff10 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2ff20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ff30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ff40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ff50 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2ff60 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2ff70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2ff80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ff90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ffa0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2ffb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2ffc0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
2ffd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2ffe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fff0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30000 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
30010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30020 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
30030 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
30040 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
30050 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
30060 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
30070 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
30080 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
30090 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
300a0 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
300b0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
300c0 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
300d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
300e0 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
300f0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
30100 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
30110 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
30120 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
30130 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
30140 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
30150 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
30160 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
30170 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
30180 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
30190 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
301a0 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
301b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
301c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
301d0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
301e0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
301f0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
30200 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
30210 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
30220 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
30230 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
30240 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
30250 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
30260 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
30270 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
30280 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
30290 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
302a0 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
302b0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
302c0 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
302d0 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
302e0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
302f0 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
30300 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
30310 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
30320 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
30330 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
30340 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
30350 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
30360 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
30370 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
30380 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
30390 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
303a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
303b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
303c0 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
303d0 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
303e0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
303f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
30400 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
30410 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
30420 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
30430 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
30440 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
30450 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
30460 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
30470 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
30480 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
30490 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
304a0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
304b0 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
304c0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
304d0 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
304e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
304f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
30500 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
30510 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30520 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
30530 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
30540 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
30550 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
30560 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
30570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30580 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30590 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
305a0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
305b0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
305c0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
305d0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
305e0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
305f0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
30600 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
30610 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
30620 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
30630 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
30640 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
30650 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
30660 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
30670 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
30680 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
30690 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
306a0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
306b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
306c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
306d0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
306e0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
306f0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
30700 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
30710 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
30720 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
30730 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
30740 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
30750 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30760 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
30770 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
30780 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
30790 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
307a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
307b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
307c0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
307d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
307e0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
307f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30800 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30810 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
30820 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
30830 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
30840 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
30850 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
30860 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
30870 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
30880 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
30890 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
308a0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
308b0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
308c0 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
308d0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
308e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
308f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
30900 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
30910 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
30920 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
30930 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
30940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
30950 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30960 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
30970 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
30980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30990 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
309a0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
309b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
309c0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
309d0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
309e0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
309f0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
30a00 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
30a10 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
30a20 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
30a30 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
30a40 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
30a50 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
30a60 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
30a70 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
30a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
30a90 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
30aa0 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
30ab0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
30ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
30ad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
30ae0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
30af0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
30b00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
30b10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
30b20 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
30b30 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
30b40 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
30b50 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
30b60 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
30b70 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
30b80 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
30b90 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
30ba0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
30bb0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
30bc0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
30bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
30be0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
30bf0 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
30c00 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
30c10 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
30c20 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
30c30 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
30c40 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
30c50 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
30c60 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
30c70 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
30c80 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
30c90 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
30ca0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
30cb0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
30cc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
30cd0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
30ce0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
30cf0 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
30d00 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
30d10 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
30d20 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
30d30 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
30d40 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
30d50 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
30d60 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
30d70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30d80 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
30d90 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
30da0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
30db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30dc0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
30dd0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
30de0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
30df0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
30e00 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
30e10 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
30e20 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
30e30 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
30e40 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
30e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30e60 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
30e70 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
30e80 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
30e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ea0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30eb0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
30ec0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
30ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ee0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
30ef0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
30f00 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
30f10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
30f20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
30f30 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
30f40 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
30f50 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
30f60 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
30f70 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
30f80 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
30f90 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
30fa0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
30fb0 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
30fc0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
30fd0 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
30fe0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
30ff0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
31000 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
31010 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
31020 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
31030 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
31040 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
31050 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
31060 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
31070 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31080 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
31090 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
310a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
310b0 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
310c0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
310d0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
310e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
310f0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
31100 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
31110 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
31120 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
31130 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
31140 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
31150 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
31160 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
31170 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
31180 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
31190 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
311a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
311b0 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
311c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
311d0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
311e0 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
311f0 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
31200 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
31210 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
31220 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
31230 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
31240 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31250 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
31260 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
31270 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
31280 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
31290 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
312a0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
312b0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
312c0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
312d0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
312e0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
312f0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
31300 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
31310 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
31320 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
31330 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
31340 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
31350 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
31360 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31370 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
31380 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
31390 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
313a0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
313b0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
313c0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
313d0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
313e0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
313f0 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
31400 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
31410 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
31420 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
31430 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
31440 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
31450 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
31460 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
31470 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
31480 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
31490 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
314a0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
314b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
314c0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
314d0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
314e0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
314f0 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
31500 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
31510 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
31520 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
31530 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
31540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31550 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
31560 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
31570 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
31580 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
31590 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
315a0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
315b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
315c0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
315d0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
315e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
315f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
31600 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31610 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
31620 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
31630 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
31640 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
31650 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
31660 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
31670 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
31680 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
31690 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
316a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
316b0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
316c0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
316d0 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
316e0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
316f0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
31700 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
31710 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
31720 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
31730 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
31740 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
31750 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
31760 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
31770 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
31780 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
31790 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
317a0 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
317b0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
317c0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
317d0 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
317e0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
317f0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
31800 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
31810 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
31820 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
31830 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
31840 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
31850 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
31860 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
31870 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
31880 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
31890 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
318a0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
318b0 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
318c0 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
318d0 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
318e0 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
318f0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
31900 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
31910 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
31920 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
31930 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
31940 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
31950 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
31960 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
31970 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
31980 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
31990 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
319a0 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
319b0 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
319c0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
319d0 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
319e0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
319f0 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
31a00 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
31a10 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
31a20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
31a30 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
31a40 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
31a50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31a60 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
31a70 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76  9920-11576 Howev
31a80 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f  er, newer versio
31a90 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69  ns of SQLite sti
31aa0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69  ll.      ** avoi
31ab0 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74  d using the last
31ac0 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20   six entries in 
31ad0 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  the freelist tru
31ae0 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e  nk page array in
31af0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
31b00 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
31b10 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e  les created by n
31b20 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
31b30 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20   SQLite can be. 
31b40 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20       ** read by 
31b50 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
31b60 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20  f SQLite..      
31b70 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
31b80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31b90 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
31ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
31bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31bc0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
31bd0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
31be0 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
31bf0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
31c00 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
31c10 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
31c20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
31c30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
31c40 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
31c50 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
31c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
31c70 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
31c80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
31c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ca0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
31cb0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
31cc0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
31cd0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
31ce0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
31cf0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
31d00 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
31d10 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
31d20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
31d30 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
31d40 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
31d50 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
31d60 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
31d70 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
31d80 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
31d90 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
31da0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
31db0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
31dc0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
31dd0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
31de0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
31df0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
31e00 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
31e10 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
31e20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
31e30 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
31e40 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
31e50 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
31e60 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
31e70 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
31e80 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
31e90 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
31ea0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
31eb0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
31ec0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
31ed0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
31ee0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
31ef0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
31f00 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31f10 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
31f20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
31f30 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
31f40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31f50 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
31f60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
31f70 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
31f80 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
31f90 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
31fa0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
31fb0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
31fc0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
31fd0 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
31fe0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
31ff0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
32000 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
32010 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
32020 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
32030 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
32040 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
32050 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
32060 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
32070 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
32080 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
32090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
320a0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
320b0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
320c0 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
320d0 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
320e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
320f0 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
32100 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
32110 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
32120 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
32130 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
32140 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
32150 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
32160 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
32170 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
32180 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
32190 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
321a0 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
321b0 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
321c0 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
321d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
321e0 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
321f0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
32200 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
32210 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
32220 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
32230 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
32240 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
32250 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
32260 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65  */.  u16 *pnSize
32270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32280 20 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20   Write the size 
32290 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65  of the Cell here
322a0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
322b0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
322c0 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
322d0 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
322e0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
322f0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
32300 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
32310 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
32320 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
32330 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
32340 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
32350 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
32360 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
32370 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
32380 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e  .nSize;.  if( in
32390 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
323a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
323b0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
323c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
323d0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
323e0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
323f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
32400 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
32410 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  3 > pPage->aData
32420 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
32430 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
32440 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32450 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  PT;  /* Cell ext
32460 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
32470 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f   page */.  }.  o
32480 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
32490 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
324a0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
324b0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
324c0 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
324d0 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
324e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
324f0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
32500 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
32510 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
32520 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
32530 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
32540 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c  sert( nOvfl>0 ||
32550 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44   .    (CORRUPT_D
32560 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  B && (info.nPayl
32570 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  oad + ovflPageSi
32580 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65  ze)<ovflPageSize
32590 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
325a0 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
325b0 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
325c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
325d0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
325e0 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
325f0 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
32600 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
32610 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
32620 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
32630 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
32640 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
32650 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
32660 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
32670 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
32680 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
32690 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
326a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
326b0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
326c0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
326d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
326e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
326f0 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
32700 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
32710 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
32720 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
32730 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
32740 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
32750 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
32760 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
32770 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
32780 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
32790 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
327a0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
327b0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
327c0 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
327d0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
327e0 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
327f0 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
32800 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
32810 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
32820 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
32830 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
32840 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
32850 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
32860 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
32870 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
32880 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
32890 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
328a0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
328b0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
328c0 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
328d0 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
328e0 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
328f0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
32900 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
32910 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
32920 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
32930 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
32940 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
32950 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
32960 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
32970 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
32980 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
32990 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
329a0 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
329b0 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
329c0 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
329d0 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
329e0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
329f0 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
32a00 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
32a10 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
32a20 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
32a30 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
32a40 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
32a50 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
32a60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
32a70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32a80 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
32a90 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
32aa0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
32ab0 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
32ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
32ad0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
32ae0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
32af0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
32b00 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
32b10 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
32b20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
32b30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
32b40 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
32b50 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
32b60 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
32b70 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
32b80 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
32b90 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
32ba0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
32bb0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
32bc0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
32bd0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
32be0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
32bf0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
32c00 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
32c10 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
32c20 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
32c30 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
32c40 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
32c50 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
32c60 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
32c70 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
32c80 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
32c90 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
32ca0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
32cb0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
32cc0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
32cd0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
32ce0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
32cf0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
32d00 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
32d10 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
32d20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
32d30 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
32d40 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
32d50 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
32d60 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
32d70 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
32d80 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
32d90 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
32da0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
32db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
32dc0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
32dd0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
32de0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
32df0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
32e00 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
32e10 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
32e20 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
32e30 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
32e40 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
32e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
32e60 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
32e70 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
32e80 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
32e90 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
32ea0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
32eb0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
32ec0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
32ed0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
32ee0 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
32ef0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
32f00 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
32f10 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
32f20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
32f30 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
32f40 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
32f50 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
32f60 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
32f70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32f80 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
32f90 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
32fa0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
32fb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32fc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
32fd0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
32fe0 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
32ff0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
33000 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
33010 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
33020 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
33030 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
33040 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
33050 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
33060 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
33070 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
33080 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
33090 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
330a0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
330b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
330c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
330d0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
330e0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
330f0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
33100 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
33110 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
33120 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
33130 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
33140 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
33150 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
33160 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
33170 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
33180 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
33190 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  load);.  }else{.
331a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74      assert( nDat
331b0 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  a==0 );.    asse
331c0 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a  rt( nZero==0 );.
331d0 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
331e0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
331f0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
33200 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20  4*)&nKey);.  .  
33210 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
33220 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20  ayload size */. 
33230 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
33240 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
33250 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
33260 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
33270 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
33280 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  { .    assert( n
33290 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20  Key<=0x7fffffff 
332a0 26 26 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20  && pKey!=0 );.  
332b0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e    nPayload = (in
332c0 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  t)nKey;.    pSrc
332d0 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
332e0 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  c = (int)nKey;. 
332f0 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61   }.  if( nPayloa
33300 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
33310 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48  al ){.    n = nH
33320 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
33330 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
33340 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
33350 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
33360 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
33370 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
33380 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
33390 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  t = nPayload;.  
333a0 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c    pPrior = pCell
333b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
333c0 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  nt mn = pPage->m
333d0 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d  inLocal;.    n =
333e0 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
333f0 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
33400 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
33410 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
33420 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
33430 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
33440 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
33450 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
33460 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67      if( n > pPag
33470 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
33480 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  = mn;.    spaceL
33490 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e  eft = n;.    *pn
334a0 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
334b0 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69  er + 4;.    pPri
334c0 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
334d0 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50  der+n];.  }.  pP
334e0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
334f0 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20  nHeader];..  /* 
33500 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
33510 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
33520 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
33530 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
33540 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
33550 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
33560 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
33570 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
33580 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
33590 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
335a0 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
335b0 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
335c0 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
335d0 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
335e0 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
335f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
33600 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
33610 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
33620 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
33630 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
33640 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
33650 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
33660 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
33670 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
33680 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
33690 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
336a0 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
336b0 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
336c0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
336d0 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
336e0 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
336f0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
33700 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
33710 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
33720 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
33730 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
33740 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c  ly..  */.#if SQL
33750 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20  ITE_DEBUG.  {.  
33760 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
33770 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
33780 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
33790 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
337a0 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72   assert( nHeader
337b0 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79  =(int)(info.pPay
337c0 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b  load - pCell) );
337d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66  .    assert( inf
337e0 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
337f0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53      assert( *pnS
33800 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a  ize == info.nSiz
33810 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
33820 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e   spaceLeft == in
33830 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  fo.nLocal );.   
33840 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 20   assert( pPrior 
33850 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  == &pCell[info.i
33860 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d  Overflow] );.  }
33870 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72  .#endif..  /* Wr
33880 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ite the payload 
33890 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43  into the local C
338a0 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72  ell and any extr
338b0 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  a into overflow 
338c0 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  pages */.  while
338d0 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
338e0 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
338f0 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
33900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33910 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
33920 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
33930 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
33940 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
33950 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
33960 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
33970 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
33980 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
33990 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
339a0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
339b0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
339c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
339d0 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
339e0 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
339f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
33a00 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
33a10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
33a20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
33a30 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
33a40 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
33a50 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 20 20  pgnoOvfl, 0);.  
33a60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33a80 20 73 71 6c 69 74 65 33 45 78 70 65 72 69 6d 65   sqlite3Experime
33a90 6e 74 61 6c 4c 6f 67 28 70 42 74 2d 3e 70 4c 6f  ntalLog(pBt->pLo
33aa0 67 2c 20 22 61 6c 6c 6f 63 61 74 65 20 25 64 20  g, "allocate %d 
33ab0 6f 76 65 72 66 6c 6f 77 22 2c 20 70 67 6e 6f 4f  overflow", pgnoO
33ac0 76 66 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  vfl);.      }.#i
33ad0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33ae0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33af0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
33b00 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
33b10 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
33b20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
33b30 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
33b40 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
33b50 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
33b60 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
33b70 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
33b80 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
33b90 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
33ba0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33bb0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
33bc0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
33bd0 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
33be0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
33bf0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
33c00 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
33c10 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
33c20 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
33c30 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
33c40 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
33c50 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
33c60 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
33c70 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
33c80 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
33c90 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
33ca0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
33cb0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
33cc0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
33cd0 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
33ce0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
33cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
33d00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
33d10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
33d20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
33d30 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
33d40 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
33d50 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
33d60 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
33d70 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
33d80 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
33d90 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
33da0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
33dc0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
33dd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33de0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
33df0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
33e00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
33e10 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
33e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
33e30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
33e40 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
33e50 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
33e60 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
33e70 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
33e80 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
33e90 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
33ea0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
33eb0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
33ec0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
33ed0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
33ee0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
33ef0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
33f00 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
33f10 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
33f20 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
33f30 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
33f40 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
33f50 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
33f60 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
33f70 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
33f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
33f90 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
33fa0 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
33fb0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
33fc0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
33fd0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
33fe0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33ff0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34000 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
34010 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
34020 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
34030 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
34040 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
34050 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
34060 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
34070 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
34080 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
34090 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
340a0 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
340b0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
340c0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
340d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
340e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
340f0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
34100 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
34110 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
34120 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
34130 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
34140 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
34150 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
34160 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
34170 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
34180 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
34190 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
341a0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
341b0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
341c0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
341d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
341e0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
341f0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
34200 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
34210 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
34220 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
34230 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
34240 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
34250 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
34260 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
34270 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
34280 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
34290 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
342a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
342b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
342c0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
342d0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
342e0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
342f0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
34300 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
34310 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
34320 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
34330 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
34340 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
34350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34360 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
34370 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
34380 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
34390 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
343a0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
343b0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
343c0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
343d0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
343e0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
343f0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
34400 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
34410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
34420 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
34430 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
34440 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
34450 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
34460 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
34470 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
34480 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
34490 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
344a0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
344b0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
344c0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
344d0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
344e0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
344f0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
34500 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
34510 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
34520 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
34530 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
34540 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
34550 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
34560 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
34570 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
34580 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
34590 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
345a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
345b0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
345c0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
345d0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
345e0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
345f0 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
34600 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
34610 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
34620 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
34630 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
34640 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
34650 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
34660 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
34670 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
34680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
34690 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
346a0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
346b0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
346c0 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
346d0 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
346e0 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
346f0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
34700 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
34710 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
34720 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
34730 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
34740 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
34750 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
34760 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
34770 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
34780 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
34790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
347a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
347b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
347c0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
347d0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
347e0 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
347f0 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63  Idx[2*idx];.  pc
34800 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
34810 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
34820 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
34830 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
34840 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
34850 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
34860 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
34870 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34880 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75  );.  if( pc < (u
34890 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74  32)get2byte(&dat
348a0 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
348b0 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
348c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
348d0 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
348e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
348f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
34900 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
34910 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
34920 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34930 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
34940 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
34950 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69  ge->nCell--;.  i
34960 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
34970 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  =0 ){.    memset
34980 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
34990 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  , 4);.    data[h
349a0 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70  dr+7] = 0;.    p
349b0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
349c0 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74  r+5], pPage->pBt
349d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
349e0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
349f0 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
34a00 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65  ableSize - pPage
34a10 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20  ->hdrOffset.    
34a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a30 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c     - pPage->chil
34a40 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20  dPtrSize - 8;.  
34a50 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f  }else{.    memmo
34a60 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
34a70 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
34a80 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32   idx));.    put2
34a90 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
34aa0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
34ab0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
34ac0 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  ee += 2;.  }.}..
34ad0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
34ae0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
34af0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
34b00 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
34b10 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
34b20 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
34b30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
34b40 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
34b50 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
34b60 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
34b70 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
34b80 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
34b90 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
34ba0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
34bb0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
34bc0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
34bd0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
34be0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
34bf0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
34c00 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
34c10 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
34c20 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
34c30 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
34c40 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
34c50 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
34c60 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
34c70 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
34c80 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
34c90 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
34ca0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
34cb0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
34cc0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34cd0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
34ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34cf0 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
34d00 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
34d10 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
34d20 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
34d30 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
34d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
34d50 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
34d60 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
34d70 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
34d80 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
34d90 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
34da0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
34db0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
34dc0 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
34dd0 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
34de0 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
34df0 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
34e00 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
34e10 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
34e20 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
34e30 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
34e40 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
34e50 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
34e60 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
34e70 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
34e80 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
34e90 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
34ea0 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
34eb0 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
34ec0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
34ed0 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
34ee0 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
34ef0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
34f00 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
34f10 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
34f20 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
34f30 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
34f40 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
34f50 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20   */.  u8 *pIns; 
34f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
34f70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61  oint in pPage->a
34f80 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20  CellIdx[] where 
34f90 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  no cell inserted
34fa0 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
34fb0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
34fc0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
34fd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
34fe0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
34ff0 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45  .  assert( MX_CE
35000 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
35010 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
35020 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
35030 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
35040 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  pBt) || CORRUPT_
35050 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
35060 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35070 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
35080 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20  e->apOvfl) );.  
35090 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
350a0 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
350b0 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ==ArraySize(pPag
350c0 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20  e->aiOvfl) );.  
350d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
350e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
350f0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
35100 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73  .  /* The cell s
35110 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
35120 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c  e sized correctl
35130 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65  y.  However, whe
35140 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20  n moving a.  ** 
35150 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66  malformed cell f
35160 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20  rom a leaf page 
35170 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70  to an interior p
35180 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  age, if the cell
35190 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65   size.  ** wante
351a0 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
351b0 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e  n 4 but got roun
351c0 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74  ded up to 4 on t
351d0 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69  he leaf, then si
351e0 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ze.  ** might be
351f0 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65   less than 8 (le
35200 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65  af-size + pointe
35210 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69  r) on the interi
35220 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a  or node.  Hence.
35230 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66    ** the term af
35240 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68  ter the || in th
35250 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
35260 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rt(). */.  asser
35270 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43  t( sz==pPage->xC
35280 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70  ellSize(pPage, p
35290 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
352a0 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
352b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
352c0 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
352d0 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
352e0 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
352f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
35300 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
35310 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
35320 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
35330 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
35340 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
35350 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
35360 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
35370 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
35380 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
35390 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
353a0 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
353b0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
353c0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
353d0 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
353e0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
353f0 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
35400 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ;..    /* When m
35410 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
35420 73 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72  s occur, they ar
35430 65 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74  e always sequent
35440 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a  ial and in.    *
35450 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  * sorted order. 
35460 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73   This invariants
35470 20 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d   arise because m
35480 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
35490 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c  s can.    ** onl
354a0 79 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73  y occur when ins
354b0 65 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63  erting divider c
354c0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
354d0 72 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67  rent page during
354e0 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  .    ** balancin
354f0 67 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  g, and the divid
35500 65 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74  ers are adjacent
35510 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20   and sorted..   
35520 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35530 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61  j==0 || pPage->a
35540 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29  iOvfl[j-1]<(u16)
35550 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  i ); /* Overflow
35560 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
35570 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
35580 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67   j==0 || i==pPag
35590 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31  e->aiOvfl[j-1]+1
355a0 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f   );   /* Overflo
355b0 77 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61  ws are sequentia
355c0 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l */.  }else{.  
355d0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
355e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
355f0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
35600 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35610 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
35620 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
35630 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
35640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
35650 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35660 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
35670 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
35680 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
35690 61 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50  assert( &data[pP
356a0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d  age->cellOffset]
356b0 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  ==pPage->aCellId
356c0 78 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  x );.    rc = al
356d0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
356e0 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
356f0 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
35700 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
35710 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
35720 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
35730 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
35740 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
35750 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
35760 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
35770 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20  cessfully */.   
35780 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
35790 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
357a0 20 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63   idx >= pPage->c
357b0 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
357c0 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f  e->nCell+2 || CO
357d0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
357e0 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
357f0 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
35800 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
35810 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
35820 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
35830 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
35840 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c  data[idx], pCell
35850 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69  , sz);.    if( i
35860 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
35870 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
35880 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
35890 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50   }.    pIns = pP
358a0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20  age->aCellIdx + 
358b0 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  i*2;.    memmove
358c0 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32  (pIns+2, pIns, 2
358d0 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
358e0 20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79   i));.    put2by
358f0 74 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20  te(pIns, idx);. 
35900 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
35910 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d  +;.    /* increm
35920 65 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ent the cell cou
35930 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b  nt */.    if( (+
35940 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  +data[pPage->hdr
35950 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20  Offset+4])==0 ) 
35960 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
35970 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20  ffset+3]++;.    
35980 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
35990 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
359a0 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61  rOffset+3])==pPa
359b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66  ge->nCell );.#if
359c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
359d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
359e0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
359f0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
35a00 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
35a10 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
35a20 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
35a30 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
35a40 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
35a50 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
35a60 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
35a70 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
35a80 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
35a90 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
35aa0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
35ab0 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
35ac0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
35ad0 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79  *.** A CellArray
35ae0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
35af0 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e   a cache of poin
35b00 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66  ters and sizes f
35b10 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74  or a.** consecut
35b20 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ive sequence of 
35b30 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74  cells that might
35b40 20 62 65 20 68 65 6c 64 20 6d 75 6c 74 69 70 6c   be held multipl
35b50 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65  e pages..*/.type
35b60 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41  def struct CellA
35b70 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a  rray CellArray;.
35b80 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
35b90 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20   {.  int nCell; 
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35bb0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
35bc0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
35bd0 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20   MemPage *pRef; 
35be0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
35bf0 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20  rence page */.  
35c00 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
35c10 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
35c20 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
35c30 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
35c40 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
35c50 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
35c60 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
35c70 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  pCell[] */.};../
35c80 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
35c90 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74  he cell sizes at
35ca0 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e   idx, idx+1, ...
35cb0 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62  , idx+N-1 have b
35cc0 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e  een.** computed.
35cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
35ce0 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68  populateCellCach
35cf0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
35d00 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b  int idx, int N){
35d10 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
35d20 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e  0 && idx+N<=p->n
35d30 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28  Cell );.  while(
35d40 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65   N>0 ){.    asse
35d50 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  rt( p->apCell[id
35d60 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  x]!=0 );.    if(
35d70 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
35d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
35d90 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e  zCell[idx] = p->
35da0 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  pRef->xCellSize(
35db0 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65  p->pRef, p->apCe
35dc0 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65  ll[idx]);.    }e
35dd0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
35de0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
35df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
35e00 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70  ->szCell[idx]==p
35e10 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
35e20 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
35e30 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20  Cell[idx]) );.  
35e40 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20    }.    idx++;. 
35e50 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f     N--;.  }.}../
35e60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
35e70 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20  size of the Nth 
35e80 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63  element of the c
35e90 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61  ell array.*/.sta
35ea0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
35eb0 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43  INE u16 computeC
35ec0 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61  ellSize(CellArra
35ed0 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  y *p, int N){.  
35ee0 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20  assert( N>=0 && 
35ef0 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  N<p->nCell );.  
35f00 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c  assert( p->szCel
35f10 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  l[N]==0 );.  p->
35f20 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70  szCell[N] = p->p
35f30 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
35f40 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
35f50 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  l[N]);.  return 
35f60 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a  p->szCell[N];.}.
35f70 73 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65  static u16 cache
35f80 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  dCellSize(CellAr
35f90 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
35fa0 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
35fb0 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
35fc0 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
35fd0 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73  N] ) return p->s
35fe0 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75  zCell[N];.  retu
35ff0 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  rn computeCellSi
36000 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ze(p, N);.}../*.
36010 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
36020 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  ] contains point
36030 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74  ers to nCell b-t
36040 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20  ree page cells. 
36050 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d  The .** szCell[]
36060 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
36070 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
36080 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20  s of each cell. 
36090 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
360a0 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75   replaces the cu
360b0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
360c0 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20  f page pPg with 
360d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
360e0 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61  the cell.** arra
360f0 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66  y..**.** Some of
36100 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70   the cells in ap
36110 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65  Cell[] may curre
36120 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ntly be stored i
36130 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66  n pPg. This.** f
36140 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72  unction works ar
36150 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
36160 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20  used by this by 
36170 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
36180 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65   any .** such ce
36190 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77  lls before overw
361a0 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
361b0 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  data..**.** The 
361c0 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69  MemPage.nFree fi
361d0 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74  eld is invalidat
361e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
361f0 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ion. It is the .
36200 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
36210 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
36220 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
36230 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tly..*/.static i
36240 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a  nt rebuildPage(.
36250 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
36260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36270 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
36280 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  age */.  int nCe
36290 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
362a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
362b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
362c0 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75  s on page */.  u
362d0 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
362e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
362f0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
36300 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
36310 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
36320 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
36330 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a  f cell sizes */.
36340 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
36350 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
36360 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
36370 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
36380 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38  r on pPg */.  u8
36390 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
363a0 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
363b0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
363c0 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
363d0 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  g */.  const int
363e0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
363f0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
36400 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ze;.  u8 * const
36410 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75   pEnd = &aData[u
36420 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e  sableSize];.  in
36430 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  t i;.  u8 *pCell
36440 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
36450 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20  Idx;.  u8 *pTmp 
36460 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
36470 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74  mpSpace(pPg->pBt
36480 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20  ->pPager);.  u8 
36490 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67  *pData;..  i = g
364a0 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  et2byte(&aData[h
364b0 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
364c0 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74  (&pTmp[i], &aDat
364d0 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  a[i], usableSize
364e0 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20   - i);..  pData 
364f0 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d  = pEnd;.  for(i=
36500 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
36510 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
36520 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = apCell[i];.   
36530 20 69 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61   if( pCell>aData
36540 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29   && pCell<pEnd )
36550 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  {.      pCell = 
36560 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44  &pTmp[pCell - aD
36570 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata];.    }.    
36580 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b  pData -= szCell[
36590 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  i];.    put2byte
365a0 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74  (pCellptr, (pDat
365b0 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20  a - aData));.   
365c0 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a   pCellptr += 2;.
365d0 20 20 20 20 69 66 28 20 70 44 61 74 61 20 3c 20      if( pData < 
365e0 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72  pCellptr ) retur
365f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
36600 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70  _BKPT;.    memcp
36610 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20  y(pData, pCell, 
36620 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  szCell[i]);.    
36630 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69  assert( szCell[i
36640 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a  ]==pPg->xCellSiz
36650 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c  e(pPg, pCell) ||
36660 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
36670 20 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 43     testcase( szC
36680 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65  ell[i]!=pPg->xCe
36690 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c  llSize(pPg,pCell
366a0 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ) );.  }..  /* T
366b0 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69  he pPg->nFree fi
366c0 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69  eld is now set i
366d0 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20  ncorrectly. The 
366e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20  caller will fix 
366f0 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43  it. */.  pPg->nC
36700 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70  ell = nCell;.  p
36710 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
36720 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
36730 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29  aData[hdr+1], 0)
36740 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
36750 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d  ata[hdr+3], pPg-
36760 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62  >nCell);.  put2b
36770 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
36780 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61  ], pData - aData
36790 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37  );.  aData[hdr+7
367a0 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75  ] = 0x00;.  retu
367b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
367c0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
367d0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
367e0 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
367f0 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
36800 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63  rray szCell.** c
36810 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
36820 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
36830 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69  h such cell. Thi
36840 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
36850 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74  pts to .** add t
36860 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20  he cells stored 
36870 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f 20  in the array to 
36880 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74 20  page pPg. If it 
36890 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20  cannot (because 
368a0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65  .** the page nee
368b0 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d  ds to be defragm
368c0 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  ented before the
368d0 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29   cells will fit)
368e0 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73  , non-zero.** is
368f0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
36900 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c  wise, if the cel
36910 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75 63  ls are added suc
36920 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20  cessfully, zero 
36930 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
36940 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
36950 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74  Cellptr points t
36960 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
36970 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  y in the cell-po
36980 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28  inter array.** (
36990 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 67  part of page pPg
369a0 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41  ) to populate. A
369b0 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c  fter cell apCell
369c0 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74  [0] is written t
369d0 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f  o the.** page bo
369e0 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66  dy, a 16-bit off
369f0 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  set is written t
36a00 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20  o pCellptr. And 
36a10 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a  so on, for each.
36a20 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ** cell in the a
36a30 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65 20  rray. It is the 
36a40 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
36a50 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
36a60 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69  ensure.** that i
36a70 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
36a80 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72 74  rwrite this part
36a90 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   of the cell-poi
36aa0 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  nter array..**.*
36ab0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
36ac0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
36ad0 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74  *ppData points t
36ae0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
36af0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  he .** content a
36b00 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e  rea on page pPg.
36b10 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
36b20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  the content area
36b30 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a   is extended,.**
36b40 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64 61   *ppData is upda
36b50 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ted to point to 
36b60 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66  the new start of
36b70 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
36b80 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  a.** before retu
36b90 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  rning..**.** Fin
36ba0 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70  ally, argument p
36bb0 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Begin points to 
36bc0 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  the byte immedia
36bd0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
36be0 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
36bf0 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
36c00 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f 72  by this page for
36c10 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
36c20 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61  r area (for.** a
36c30 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a  ll cells - not j
36c40 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74  ust those insert
36c50 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
36c60 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20  t call). If the 
36c70 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20  content.** area 
36c80 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65 64  must be extended
36c90 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20   to before this 
36ca0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
36cb0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c  o accomodate all
36cc0 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  .** cells in apC
36cd0 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20  ell[], then the 
36ce0 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74  cells do not fit
36cf0 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73   and non-zero is
36d00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
36d10 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73  atic int pageIns
36d20 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  ertArray(.  MemP
36d30 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
36d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
36d50 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73  age to add cells
36d60 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65   to */.  u8 *pBe
36d70 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  gin,            
36d80 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
36d90 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  of cell-pointer 
36da0 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a  array */.  u8 **
36db0 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  ppData,         
36dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
36dd0 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65  /OUT: Page conte
36de0 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72  nt -area pointer
36df0 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
36e00 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
36e10 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
36e20 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   to cell-pointer
36e30 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
36e40 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
36e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
36e60 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
36e70 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e  l to add */.  in
36e80 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36ea0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
36eb0 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a   to add to pPg *
36ec0 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70  /.  CellArray *p
36ed0 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  CArray          
36ee0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
36ef0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
36f00 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61  t i;.  u8 *aData
36f10 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
36f20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70   u8 *pData = *pp
36f30 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64  Data;.  int iEnd
36f40 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c   = iFirst + nCel
36f50 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  l;.  assert( COR
36f60 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e  RUPT_DB || pPg->
36f70 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  hdrOffset==0 ); 
36f80 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
36f90 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a  ed on page 1 */.
36fa0 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
36fb0 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<iEnd; i++){.  
36fc0 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20    int sz, rc;.  
36fd0 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20    u8 *pSlot;.   
36fe0 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c   sz = cachedCell
36ff0 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29  Size(pCArray, i)
37000 3b 0a 20 20 20 20 69 66 28 20 28 61 44 61 74 61  ;.    if( (aData
37010 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b  [1]==0 && aData[
37020 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74  2]==0) || (pSlot
37030 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
37040 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20  pPg,sz,&rc))==0 
37050 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d  ){.      pData -
37060 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  = sz;.      if( 
37070 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72  pData<pBegin ) r
37080 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70  eturn 1;.      p
37090 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20  Slot = pData;.  
370a0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
370b0 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61  Slot, pCArray->a
370c0 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20  pCell[i], sz);. 
370d0 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
370e0 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61  lptr, (pSlot - a
370f0 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
37100 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  lptr += 2;.  }. 
37110 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61   *ppData = pData
37120 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
37130 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
37140 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
37150 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
37160 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
37170 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20  rray szCell .** 
37180 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
37190 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
371a0 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
371b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73  is function adds
371c0 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73   the.** space as
371d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
371e0 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ch cell in the a
371f0 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72  rray that is cur
37200 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a  rently stored .*
37210 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64  * within the bod
37220 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20  y of pPg to the 
37230 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  pPg free-list. T
37240 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73  he cell-pointers
37250 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69   and other.** fi
37260 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65  elds of the page
37270 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64   are not updated
37280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
37290 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
372a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
372b0 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f  f cells added to
372c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
372d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
372e0 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d  geFreeArray(.  M
372f0 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
37300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37310 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a  * Page to edit *
37320 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
37330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37340 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c      /* First cel
37350 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
37360 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
37370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37380 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c   /* Cells to del
37390 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  ete */.  CellArr
373a0 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
373b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
373c0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
373d0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
373e0 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
373f0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
37400 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
37410 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37420 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
37430 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
37440 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
37450 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64  + 8 + pPg->child
37460 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  PtrSize];.  int 
37470 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
37480 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  i;.  int iEnd = 
37490 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a  iFirst + nCell;.
374a0 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
374b0 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20  .  int szFree = 
374c0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72  0;..  for(i=iFir
374d0 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29  st; i<iEnd; i++)
374e0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
374f0 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  = pCArray->apCel
37500 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  l[i];.    if( pC
37510 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70  ell>=pStart && p
37520 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20  Cell<pEnd ){.   
37530 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20     int sz;.     
37540 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75   /* No need to u
37550 73 65 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a  se cachedCellSiz
37560 65 28 29 20 68 65 72 65 2e 20 20 54 68 65 20 73  e() here.  The s
37570 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  izes of all cell
37580 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  s that.      ** 
37590 61 72 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  are to be freed 
375a0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
375b0 6e 20 63 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c  n computing whil
375c0 65 20 64 65 63 69 64 69 6e 67 20 77 68 69 63 68  e deciding which
375d0 0a 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20  .      ** cells 
375e0 6e 65 65 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a  need freeing */.
375f0 20 20 20 20 20 20 73 7a 20 3d 20 70 43 41 72 72        sz = pCArr
37600 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20  ay->szCell[i];  
37610 61 73 73 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a  assert( sz>0 );.
37620 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21        if( pFree!
37630 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b  =(pCell + sz) ){
37640 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
37650 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
37660 61 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44  assert( pFree>aD
37670 61 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20  ata && (pFree - 
37680 61 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a  aData)<65536 );.
37690 20 20 20 20 20 20 20 20 20 20 66 72 65 65 53 70            freeSp
376a0 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70  ace(pPg, (u16)(p
376b0 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73  Free - aData), s
376c0 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  zFree);.        
376d0 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20  }.        pFree 
376e0 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20  = pCell;.       
376f0 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20   szFree = sz;.  
37700 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 2b        if( pFree+
37710 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75 72 6e  sz>pEnd ) return
37720 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
37730 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d  .        pFree =
37740 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pCell;.        
37750 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20  szFree += sz;.  
37760 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74      }.      nRet
37770 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
37780 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
37790 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e 61   assert( pFree>a
377a0 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20 2d  Data && (pFree -
377b0 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b   aData)<65536 );
377c0 0a 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70  .    freeSpace(p
377d0 50 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20  Pg, (u16)(pFree 
377e0 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65  - aData), szFree
377f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37800 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61  nRet;.}../*.** a
37810 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
37820 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ll[] contains po
37830 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20 73 69  inters to and si
37840 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  zes of all cells
37850 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 73   in the.** pages
37860 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e   being balanced.
37870 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 70 61    The current pa
37880 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70 50 67  ge, pPg, has pPg
37890 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20 73 74  ->nCell cells st
378a0 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61  arting.** with a
378b0 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20 41 66  pCell[iOld].  Af
378c0 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  ter balancing, t
378d0 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c 64 20  his page should 
378e0 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c 73 0a  hold nNew cells.
378f0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 61  ** starting at a
37900 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a  pCell[iNew]..**.
37910 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
37920 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73  makes the necess
37930 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
37940 74 6f 20 70 50 67 20 73 6f 20 74 68 61 74 20 69  to pPg so that i
37950 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  t contains.** th
37960 65 20 63 6f 72 72 65 63 74 20 63 65 6c 6c 73 20  e correct cells 
37970 61 66 74 65 72 20 62 65 69 6e 67 20 62 61 6c 61  after being bala
37980 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nced..**.** The 
37990 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
379a0 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68 65 6e   is invalid when
379b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
379c0 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20 74 68  eturns. It is th
379d0 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c  e.** responsibil
379e0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
379f0 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72  r to set it corr
37a00 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
37a10 20 69 6e 74 20 65 64 69 74 50 61 67 65 28 0a 20   int editPage(. 
37a20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
37a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a40 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
37a50 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c 64  ge */.  int iOld
37a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37a70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
37a80 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 63   of first cell c
37a90 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61 67 65  urrently on page
37aa0 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 2c 20   */.  int iNew, 
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ac0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
37ad0 66 20 6e 65 77 20 66 69 72 73 74 20 63 65 6c 6c  f new first cell
37ae0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e   on page */.  in
37af0 74 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20 20  t nNew,         
37b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37b10 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Final number of
37b20 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a   cells on page *
37b30 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70  /.  CellArray *p
37b40 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  CArray          
37b50 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
37b60 63 65 6c 6c 73 20 61 6e 64 20 73 69 7a 65 73 20  cells and sizes 
37b70 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e  */.){.  u8 * con
37b80 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
37b90 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69  aData;.  const i
37ba0 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
37bb0 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 70  rOffset;.  u8 *p
37bc0 42 65 67 69 6e 20 3d 20 26 70 50 67 2d 3e 61 43  Begin = &pPg->aC
37bd0 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a 20 32 5d  ellIdx[nNew * 2]
37be0 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  ;.  int nCell = 
37bf0 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20 20 20 20  pPg->nCell;     
37c00 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74 6f 72 65    /* Cells store
37c10 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38  d on pPg */.  u8
37c20 20 2a 70 44 61 74 61 3b 0a 20 20 75 38 20 2a 70   *pData;.  u8 *p
37c30 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e 74 20 69  Cellptr;.  int i
37c40 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45 6e 64 20  ;.  int iOldEnd 
37c50 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 6e 43  = iOld + pPg->nC
37c60 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f 76 65 72  ell + pPg->nOver
37c70 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69 4e 65 77  flow;.  int iNew
37c80 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20 6e 4e 65  End = iNew + nNe
37c90 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w;..#ifdef SQLIT
37ca0 45 5f 44 45 42 55 47 0a 20 20 75 38 20 2a 70 54  E_DEBUG.  u8 *pT
37cb0 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
37cc0 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e  rTempSpace(pPg->
37cd0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
37ce0 6d 65 6d 63 70 79 28 70 54 6d 70 2c 20 61 44 61  memcpy(pTmp, aDa
37cf0 74 61 2c 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  ta, pPg->pBt->us
37d00 61 62 6c 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  ableSize);.#endi
37d10 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  f..  /* Remove c
37d20 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ells from the st
37d30 61 72 74 20 61 6e 64 20 65 6e 64 20 6f 66 20 74  art and end of t
37d40 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  he page */.  if(
37d50 20 69 4f 6c 64 3c 69 4e 65 77 20 29 7b 0a 20 20   iOld<iNew ){.  
37d60 20 20 69 6e 74 20 6e 53 68 69 66 74 20 3d 20 70    int nShift = p
37d70 61 67 65 46 72 65 65 41 72 72 61 79 28 70 50 67  ageFreeArray(pPg
37d80 2c 20 69 4f 6c 64 2c 20 69 4e 65 77 2d 69 4f 6c  , iOld, iNew-iOl
37d90 64 2c 20 70 43 41 72 72 61 79 29 3b 0a 20 20 20  d, pCArray);.   
37da0 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61 43   memmove(pPg->aC
37db0 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61 43  ellIdx, &pPg->aC
37dc0 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32 5d  ellIdx[nShift*2]
37dd0 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20  , nCell*2);.    
37de0 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74 3b  nCell -= nShift;
37df0 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e 65 77 45  .  }.  if( iNewE
37e00 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b 0a  nd < iOldEnd ){.
37e10 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61 67      nCell -= pag
37e20 65 46 72 65 65 41 72 72 61 79 28 70 50 67 2c 20  eFreeArray(pPg, 
37e30 69 4e 65 77 45 6e 64 2c 20 69 4f 6c 64 45 6e 64  iNewEnd, iOldEnd
37e40 20 2d 20 69 4e 65 77 45 6e 64 2c 20 70 43 41 72   - iNewEnd, pCAr
37e50 72 61 79 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61  ray);.  }..  pDa
37e60 74 61 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32  ta = &aData[get2
37e70 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 61 44 61  byteNotZero(&aDa
37e80 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69  ta[hdr+5])];.  i
37e90 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
37ea0 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
37eb0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  fail;..  /* Add 
37ec0 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 73 74 61  cells to the sta
37ed0 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
37ee0 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c  /.  if( iNew<iOl
37ef0 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64  d ){.    int nAd
37f00 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 69 4f 6c  d = MIN(nNew,iOl
37f10 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20 61 73 73  d-iNew);.    ass
37f20 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e 65 77 29  ert( (iOld-iNew)
37f30 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c 6c 3d 3d  <nNew || nCell==
37f40 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
37f50 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
37f60 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
37f70 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43  .    memmove(&pC
37f80 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32 5d 2c 20  ellptr[nAdd*2], 
37f90 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a  pCellptr, nCell*
37fa0 32 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  2);.    if( page
37fb0 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
37fc0 20 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67         pPg, pBeg
37fd0 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c  in, &pData, pCel
37fe0 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  lptr,.          
37ff0 69 4e 65 77 2c 20 6e 41 64 64 2c 20 70 43 41 72  iNew, nAdd, pCAr
38000 72 61 79 0a 20 20 20 20 29 20 29 20 67 6f 74 6f  ray.    ) ) goto
38010 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a   editpage_fail;.
38020 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64      nCell += nAd
38030 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  d;.  }..  /* Add
38040 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65   any overflow ce
38050 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  lls */.  for(i=0
38060 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ; i<pPg->nOverfl
38070 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ow; i++){.    in
38080 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64 20  t iCell = (iOld 
38090 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d  + pPg->aiOvfl[i]
380a0 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69 66  ) - iNew;.    if
380b0 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69 43  ( iCell>=0 && iC
380c0 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20 20  ell<nNew ){.    
380d0 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50    pCellptr = &pP
380e0 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43 65 6c  g->aCellIdx[iCel
380f0 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20 6d 65  l * 2];.      me
38100 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b  mmove(&pCellptr[
38110 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 28 6e  2], pCellptr, (n
38120 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20 2a 20  Cell - iCell) * 
38130 32 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  2);.      nCell+
38140 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67  +;.      if( pag
38150 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
38160 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70            pPg, p
38170 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70  Begin, &pData, p
38180 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20  Cellptr,.       
38190 20 20 20 20 20 69 43 65 6c 6c 2b 69 4e 65 77 2c       iCell+iNew,
381a0 20 31 2c 20 70 43 41 72 72 61 79 0a 20 20 20 20   1, pCArray.    
381b0 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
381c0 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a  age_fail;.    }.
381d0 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
381e0 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e   cells to the en
381f0 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
38200 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70  .  pCellptr = &p
38210 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  Pg->aCellIdx[nCe
38220 6c 6c 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67  ll*2];.  if( pag
38230 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
38240 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69        pPg, pBegi
38250 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c  n, &pData, pCell
38260 70 74 72 2c 0a 20 20 20 20 20 20 20 20 69 4e 65  ptr,.        iNe
38270 77 2b 6e 43 65 6c 6c 2c 20 6e 4e 65 77 2d 6e 43  w+nCell, nNew-nC
38280 65 6c 6c 2c 20 70 43 41 72 72 61 79 0a 20 20 29  ell, pCArray.  )
38290 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
382a0 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e  _fail;..  pPg->n
382b0 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  Cell = nNew;.  p
382c0 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
382d0 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
382e0 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  aData[hdr+3], pP
382f0 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  g->nCell);.  put
38300 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
38310 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61  +5], pData - aDa
38320 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ta);..#ifdef SQL
38330 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
38340 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21  i=0; i<nNew && !
38350 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29  CORRUPT_DB; i++)
38360 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
38370 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  = pCArray->apCel
38380 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20 20 20 20 69  l[i+iNew];.    i
38390 6e 74 20 69 4f 66 66 20 3d 20 67 65 74 32 62 79  nt iOff = get2by
383a0 74 65 41 6c 69 67 6e 65 64 28 26 70 50 67 2d 3e  teAligned(&pPg->
383b0 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a  aCellIdx[i*2]);.
383c0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61      if( pCell>=a
383d0 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26 61  Data && pCell<&a
383e0 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
383f0 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20  sableSize] ){.  
38400 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
38410 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
38420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
38430 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43  rt( 0==memcmp(pC