/ Hex Artifact Content
Login

Artifact a0eb750d855376724ba51401e0d2077d48fdb8d7:


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 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
8910: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
8920: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
8930: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
8940: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
8950: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
8960: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
8970: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
8980: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
8990: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
89a0: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
89b0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
89c0: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
89d0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
89e0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
89f0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8a00: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8a20: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8a30: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8a40: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
8a50: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8a60: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8a70: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a90: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
8aa0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
8ab0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
8ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8ad0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
8ae0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
8af0: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
8b00: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
8b10: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
8b20: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
8b30: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8b40: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8b50: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
8b60: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
8b70: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
8b80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8b90: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
8ba0: 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  || pPage->noPayl
8bb0: 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oad );.  assert(
8bc0: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
8bd0: 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d==0 );.  assert
8be0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
8bf0: 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eaf );.  assert(
8c00: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8c10: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Size==0 );.  pIt
8c20: 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f  er = pCell;..  /
8c30: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
8c40: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
8c50: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
8c60: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
8c70: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
8c80: 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ter, nPayload);.
8c90: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
8ca0: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
8cb0: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
8cc0: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e  n call..  */.  n
8cd0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
8ce0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
8cf0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
8d00: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
8d10: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
8d20: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
8d30: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
8d40: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
8d50: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
8d60: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
8d70: 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30  ( (*pIter)>=0x80
8d80: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8d90: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
8da0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
8db0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
8dc0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
8dd0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
8de0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8df0: 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70  (pIter, (u64*)&p
8e00: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a  Info->nKey);.  *
8e10: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
8e20: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
8e30: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
8e40: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79  all..  */.  iKey
8e50: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
8e60: 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20   iKey>=0x80 ){. 
8e70: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
8e80: 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65  Iter[7];.    iKe
8e90: 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77  y &= 0x7f;.    w
8ea0: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
8eb0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20  Key = (iKey<<7) 
8ec0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
8ed0: 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  7f);.      if( (
8ee0: 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62  *pIter)<0x80 ) b
8ef0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
8f00: 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
8f10: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69         iKey = (i
8f20: 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74  Key<<8) | *++pIt
8f30: 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  er;.        brea
8f40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
8f50: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
8f60: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
8f70: 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20   *(i64*)&iKey;. 
8f80: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
8f90: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
8fa0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
8fb0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
8fc0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
8fd0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
8fe0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
8ff0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9000: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9010: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9020: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9030: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9040: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9050: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9060: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9070: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9080: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9090: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
90a0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
90b0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
90c0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
90d0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
90e0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
90f0: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9100: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9110: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9120: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9130: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
9140: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  flow = 0;.  }els
9150: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9160: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9170: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9180: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9190: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
91a0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
91b0: 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d  lPtrIndex(.  Mem
91c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
91d0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
91e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91f0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9210: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9220: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9230: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9240: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9250: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9260: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9270: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9280: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9290: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
92a0: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
92b0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
92c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
92d0: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
92e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
92f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9300: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9310: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9320: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9330: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9340: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9350: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9360: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9370: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
9380: 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  d==0 );.  pIter 
9390: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
93a0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
93b0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
93c0: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
93d0: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
93e0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
93f0: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
9400: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
9410: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
9420: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
9430: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
9440: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
9450: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
9460: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9470: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9480: 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  +;.  pInfo->nKey
9490: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
94a0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
94b0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
94c0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
94d0: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
94e0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
94f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9500: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9510: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9520: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
9530: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
9540: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
9550: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
9560: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
9570: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
9580: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
9590: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
95a0: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
95b0: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
95c0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
95d0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
95e0: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
95f0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
9600: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
9610: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
9620: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
9630: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
9640: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
9650: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
9660: 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
9670: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
9680: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
9690: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
96a0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
96b0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
96c0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
96d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
96e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
96f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
9700: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
9710: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
9720: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
9730: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
9740: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
9750: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9760: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9780: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
9790: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
97a0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
97b0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
97c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
97d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
97e0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
97f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
9800: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
9810: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
9820: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
9830: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9840: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
9850: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
9860: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
9870: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
9880: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
9890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
98a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
98b0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
98c0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
98d0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
98e0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
98f0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
9900: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
9910: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
9920: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
9930: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
9940: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
9950: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
9960: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
9970: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
9980: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
9990: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
99a0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
99b0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
99c0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
99d0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
99e0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
99f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
9a00: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
9a10: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a40: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
9a50: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
9a60: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
9a90: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9aa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9ab0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
9ac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
9ad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
9ae0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
9af0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
9b00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
9b10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
9b20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
9b30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
9b40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
9b50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
9b60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
9b70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
9b80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
9b90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
9ba0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
9bb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
9bc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
9bd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
9be0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9bf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
9c00: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
9c10: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
9c20: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
9c30: 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70   );.  nSize = *p
9c40: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a  Iter;.  if( nSiz
9c50: 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70  e>=0x80 ){.    p
9c60: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9c70: 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78  .    nSize &= 0x
9c80: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
9c90: 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65    nSize = (nSize
9ca0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9cb0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9cc0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
9cd0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
9ce0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
9cf0: 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  r++;.  if( pPage
9d00: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
9d10: 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69  /* pIter now poi
9d20: 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69  nts at the 64-bi
9d30: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61  t integer key va
9d40: 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20  lue, a variable 
9d50: 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69  length .    ** i
9d60: 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c  nteger. The foll
9d70: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
9d80: 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  s pIter to point
9d90: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
9da0: 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  te.    ** past t
9db0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65  he end of the ke
9dc0: 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20  y value. */.    
9dd0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
9de0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70  ;.    while( (*p
9df0: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
9e00: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9e10: 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  }.  testcase( nS
9e20: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
9e30: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9e40: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9e50: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9e60: 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61    if( nSize<=pPa
9e70: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
9e80: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33      nSize += (u3
9e90: 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  2)(pIter - pCell
9ea0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
9eb0: 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  <4 ) nSize = 4;.
9ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
9ed0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9ee0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
9ef0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
9f00: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
9f10: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
9f20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9f30: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
9f40: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
9f50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9f60: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
9f70: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
9f80: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
9f90: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
9fa0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
9fb0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
9fc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
9fd0: 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70  e += 4 + (u16)(p
9fe0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9ff0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69   }.  assert( nSi
a000: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
a010: 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
a020: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a030: 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74  16)nSize;.}.stat
a040: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
a050: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50  trNoPayload(MemP
a060: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
a070: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
a080: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b  ter = pCell + 4;
a090: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
a0a0: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
a0b0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
a0c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a0d0: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
a0e0: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66  a varint */..#if
a0f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a100: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
a110: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
a120: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
a130: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
a140: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
a150: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
a160: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
a170: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
a180: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
a190: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
a1a0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
a1b0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
a1c0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
a1d0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
a1e0: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
a1f0: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
a200: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
a210: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
a220: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
a230: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
a240: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
a250: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
a260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a270: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
a280: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
a290: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
a2a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a2b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a2c0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
a2d0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
a2e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a2f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
a300: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
a310: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a320: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
a330: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
a340: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
a350: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
a360: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
a370: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
a380: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
a390: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a3b0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
a3c0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
a3d0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
a3e0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
a3f0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
a400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a410: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
a420: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
a430: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
a440: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
a450: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
a460: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
a470: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
a480: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
a490: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
a4a0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
a4b0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
a4c0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
a4d0: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
a4e0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
a4f0: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
a500: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
a510: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
a520: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
a530: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
a540: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
a550: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
a560: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
a570: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
a580: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
a590: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
a5a0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
a5b0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
a5c0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
a5d0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
a5e0: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
a5f0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
a600: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
a610: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
a620: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
a630: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
a640: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
a650: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
a660: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
a670: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
a680: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
a690: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
a6a0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
a6b0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
a6c0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
a6d0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
a6e0: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
a6f0: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
a700: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
a710: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
a720: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
a730: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
a740: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
a750: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
a760: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
a770: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
a780: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
a790: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
a7a0: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
a7b0: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
a7c0: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
a7d0: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
a7e0: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
a7f0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
a800: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
a810: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
a820: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
a830: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a840: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
a850: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
a860: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
a870: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
a880: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
a8b0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
a8c0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
a8f0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
a900: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
a910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
a920: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
a930: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
a940: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
a950: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a960: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
a970: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
a980: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
a990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
a9a0: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
a9b0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
a9c0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9e0: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
a9f0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
aa00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
aa10: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
aa20: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
aa30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
aa40: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
aa50: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
aa60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
aa70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
aa80: 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  rc;        /* So
aa90: 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  urce of content 
aaa0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
aab0: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
aac0: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
aad0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
aae0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
aaf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
ab00: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
ab10: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20  ell index */... 
ab20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ab30: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
ab40: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ab50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ab60: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
ab70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ab80: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
ab90: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
aba0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
abb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
abc0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
abd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
abe0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
abf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ac00: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
ac10: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
ac20: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
ac30: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ac40: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
ac50: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
ac60: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
ac70: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
ac80: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
ac90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
aca0: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
acb0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
acc0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
acd0: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
ace0: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
acf0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
ad00: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
ad10: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
ad20: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
ad30: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
ad40: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
ad50: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
ad60: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
ad70: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
ad80: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
ad90: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
ada0: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
adb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
adc0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
add0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
ade0: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
adf0: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
ae00: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
ae10: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
ae20: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
ae30: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
ae40: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
ae50: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
ae60: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
ae70: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
ae80: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
ae90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aea0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
aeb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
aec0: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
aed0: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
aee0: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
aef0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
af00: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
af10: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
af20: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
af30: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
af40: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
af50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
af60: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
af70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
af80: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
af90: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
afa0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
afb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
afc0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
afd0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
afe0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
aff0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b000: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
b010: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
b020: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
b030: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
b040: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
b050: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
b060: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
b070: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
b080: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
b090: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
b0a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b0b0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
b0c0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
b0d0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
b0e0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
b0f0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
b100: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
b110: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
b120: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
b130: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
b140: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
b150: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b160: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
b170: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
b180: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
b190: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
b1a0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
b1b0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
b1c0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
b1d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b1e0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b1f0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b200: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
b210: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
b220: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
b230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b240: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b250: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b260: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
b270: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
b280: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
b290: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
b2a0: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
b2b0: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
b2c0: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
b2d0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
b2e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
b2f0: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
b300: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
b310: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
b320: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
b330: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
b340: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
b350: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
b360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
b370: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
b380: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
b390: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
b3a0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
b3b0: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
b3c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
b3d0: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
b3e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
b3f0: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
b400: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
b410: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
b420: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
b430: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
b440: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
b450: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
b460: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
b470: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
b480: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
b490: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
b4a0: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
b4b0: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
b4c0: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
b4d0: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
b4e0: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
b4f0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
b500: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
b510: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
b520: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
b530: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
b540: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
b550: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
b560: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
b570: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
b580: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
b590: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b5a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  ;..  assert( pc>
b5b0: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
b5c0: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
b5d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b5e0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
b5f0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
b600: 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32  OF: R-06866-3912
b610: 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  5 Freeblocks are
b620: 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65   always connecte
b630: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20  d in order of.  
b640: 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20    ** increasing 
b650: 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  offset. */.    i
b660: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
b670: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
b680: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
b690: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b6a0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
b6b0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
b6c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
b6d0: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
b6e0: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
b6f0: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
b700: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
b710: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
b720: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
b730: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
b740: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
b750: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
b760: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
b770: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
b780: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
b790: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
b7a0: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
b7b0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
b7c0: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
b7d0: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
b7e0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
b7f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
b800: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
b810: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
b820: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
b830: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
b840: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
b850: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
b870: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b880: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
b890: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
b8a0: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
b8b0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
b8c0: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
b8d0: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
b8e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b8f0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
b900: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
b910: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b920: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
b930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
b940: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
b950: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
b960: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
b970: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
b980: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
b990: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
b9a0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
b9b0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
b9c0: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
b9d0: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
b9e0: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
b9f0: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
ba00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba10: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
ba20: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
ba30: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
ba40: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
ba50: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
ba60: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
ba70: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
ba80: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
ba90: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
baa0: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
bab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bac0: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
bad0: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
bae0: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
baf0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
bb00: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
bb10: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
bb20: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
bb30: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
bb40: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
bb50: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
bb60: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
bb70: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
bb80: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
bb90: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
bba0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
bbb0: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
bbc0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
bbd0: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
bbe0: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
bbf0: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
bc00: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
bc10: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
bc20: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
bc30: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
bc40: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
bc50: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
bc60: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
bc70: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
bc80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
bc90: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
bca0: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
bcb0: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
bcc0: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
bcd0: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
bce0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
bcf0: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
bd00: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
bd10: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
bd20: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
bd30: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
bd40: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
bd50: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
bd60: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
bd70: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
bd80: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
bd90: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
bda0: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
bdb0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
bdc0: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
bdd0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
bde0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
bdf0: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
be00: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
be10: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
be20: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
be30: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
be40: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
be50: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
be60: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
be70: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
be80: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
be90: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
bec0: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
bed0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
bee0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf00: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
bf10: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
bf20: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
bf30: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
bf40: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
bf50: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
bf60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
bf70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bf80: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
bf90: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
bfa0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
bfb0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
bfc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
bfd0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
bfe0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
bff0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c000: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
c010: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
c020: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
c030: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
c040: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
c050: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c060: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c070: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
c080: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c090: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
c0a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
c0b0: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
c0c0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
c0d0: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
c0e0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c0f0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
c100: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
c110: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
c120: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c130: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
c140: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
c150: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
c160: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
c170: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
c180: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
c190: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
c1a0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
c1b0: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
c1c0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
c1d0: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
c1e0: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
c1f0: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
c200: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
c210: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
c220: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
c230: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
c240: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
c250: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
c260: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
c270: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
c280: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
c290: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
c2a0: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
c2b0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c2c0: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
c2d0: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
c2e0: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
c2f0: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
c300: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
c310: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c320: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
c330: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
c340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c360: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c370: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
c380: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
c390: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
c3a0: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
c3b0: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
c3c0: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
c3d0: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
c3e0: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
c3f0: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
c400: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
c410: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
c420: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
c430: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
c440: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
c450: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
c460: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
c470: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
c480: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
c490: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
c4a0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
c4b0: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
c4c0: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
c4d0: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
c4e0: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
c4f0: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
c500: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
c510: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
c520: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
c530: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
c540: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
c550: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
c560: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
c570: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
c580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c590: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
c5a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
c5b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
c5c0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
c5d0: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
c5e0: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
c5f0: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
c600: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
c610: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
c620: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
c630: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
c640: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
c650: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
c660: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
c670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c680: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
c690: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
c6a0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
c6b0: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
c6c0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
c6d0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
c6e0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
c6f0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
c700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
c710: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
c720: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
c730: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
c740: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
c750: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
c760: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
c770: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
c780: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
c790: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
c7a0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
c7b0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
c7c0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
c7d0: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
c7e0: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
c7f0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
c800: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
c810: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
c820: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
c830: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
c840: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
c850: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
c860: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
c870: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
c880: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
c890: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c8a0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
c8b0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
c8c0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c8d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c8e0: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
c8f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c910: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
c920: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
c930: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
c940: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
c950: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
c960: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
c970: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
c980: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
c990: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
c9a0: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
c9b0: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
c9c0: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
c9d0: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
c9e0: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
c9f0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
ca00: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
ca10: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
ca20: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
ca30: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
ca40: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
ca50: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
ca60: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
ca70: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
ca80: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
ca90: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
caa0: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
cab0: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
cac0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cad0: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
cae0: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
caf0: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
cb00: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
cb10: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
cb20: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
cb30: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
cb40: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
cb50: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
cb60: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
cb70: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
cb80: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
cb90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbb0: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
cbc0: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
cbd0: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
cbe0: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cc00: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
cc10: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
cc20: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
cc50: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
cc60: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
cc70: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
cca0: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
ccb0: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
ccc0: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
cce0: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
ccf0: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
cd00: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
cd10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
cd20: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
cd30: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
cd40: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
cd50: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
cd60: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
cd70: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
cd80: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
cd90: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
cda0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
cdb0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
cdc0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
cdd0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
cde0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
cdf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ce00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
ce10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
ce20: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
ce30: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
ce40: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
ce50: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
ce60: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
ce70: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
ce80: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
ce90: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
cea0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
ceb0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
cec0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
ced0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
cee0: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
cef0: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
cf00: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
cf10: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
cf20: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
cf30: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
cf40: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
cf50: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
cf60: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
cf70: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
cf80: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
cf90: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
cfa0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
cfb0: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
cfc0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
cfd0: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
cfe0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
cff0: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
d000: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
d010: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
d020: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
d030: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
d040: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
d050: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
d060: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
d070: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d080: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
d090: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
d0a0: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
d0b0: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
d0c0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
d0d0: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
d0e0: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
d0f0: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
d100: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
d110: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
d120: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d130: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30  (&data[iPtr]))>0
d140: 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74   && iFreeBlk<iSt
d150: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
d160: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
d170: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d180: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d190: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
d1a0: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
d1b0: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
d1c0: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
d1d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d1e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
d1f0: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
d200: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
d210: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
d220: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
d230: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
d240: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
d250: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
d260: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
d270: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
d280: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
d290: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
d2a0: 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
d2b0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
d2c0: 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
d2d0: 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
d2e0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
d2f0: 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
d300: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
d310: 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
d320: 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
d330: 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
d340: 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
d350: 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
d360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d370: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d380: 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c    iEnd = iFreeBl
d390: 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  k + get2byte(&da
d3a0: 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b  ta[iFreeBlk+2]);
d3b0: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 20  .      if( iEnd 
d3c0: 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
d3d0: 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75 72  ableSize ) retur
d3e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d3f0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53 69  _BKPT;.      iSi
d400: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
d410: 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
d420: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
d430: 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
d440: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
d450: 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
d460: 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
d470: 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
d480: 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
d490: 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
d4a0: 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
d4b0: 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
d4c0: 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
d4d0: 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
d4e0: 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
d4f0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
d500: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
d510: 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
d520: 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
d530: 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
d540: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
d550: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
d560: 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
d570: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
d580: 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
d590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d5a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d5b0: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
d5c0: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
d5d0: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
d5e0: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
d5f0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
d600: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
d610: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
d620: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
d630: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d640: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74  PT_BKPT;.    dat
d650: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
d660: 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74  g;.  }.  if( iSt
d670: 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64  art==get2byte(&d
d680: 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20  ata[hdr+5]) ){. 
d690: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
d6a0: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
d6b0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
d6c0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d6d0: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
d6e0: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
d6f0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d700: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
d710: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
d720: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
d730: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  ry */.    if( iP
d740: 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
d750: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d760: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32  T_BKPT;.    put2
d770: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
d780: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
d790: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
d7a0: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
d7b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
d7c0: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
d7d0: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
d7e0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
d7f0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
d800: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
d810: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
d820: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
d830: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
d840: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
d850: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
d860: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
d870: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
d880: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d890: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
d8a0: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
d8b0: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
d8c0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
d8d0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
d8e0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
d8f0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
d900: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
d910: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
d920: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
d930: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
d940: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
d950: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
d960: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
d970: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
d980: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
d990: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
d9a0: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
d9b0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
d9c0: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
d9d0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
d9e0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
d9f0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
da00: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
da10: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
da20: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
da30: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
da40: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
da50: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
da60: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
da70: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
da80: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
da90: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
daa0: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
dab0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
dac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
dad0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
dae0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
daf0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
db00: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
db10: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
db20: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
db30: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
db40: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
db50: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
db60: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
db70: 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e  >leaf;.  pPage->
db80: 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
db90: 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d  SizePtr;.  pBt =
dba0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
dbb0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
dbc0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
dbd0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
dbe0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
dbf0: 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20 41 20  R-03640-13415 A 
dc00: 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61 6e 73  value of 5 means
dc10: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20   the page is an 
dc20: 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20  interior.    ** 
dc30: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
dc40: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
dc50: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
dc60: 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29  PTF_INTKEY)==5 )
dc70: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
dc80: 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d 36 31  E-OF: R-20501-61
dc90: 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31  796 A value of 1
dca0: 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  3 means the page
dcb0: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
dcc0: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  * table b-tree p
dcd0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
dce0: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
dcf0: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  A|PTF_INTKEY|PTF
dd00: 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20  _LEAF)==13 );.  
dd10: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
dd20: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
dd30: 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
dd40: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
dd50: 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  eaf = 1;.      p
dd60: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
dd70: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
dd80: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
dd90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
dda0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ddb0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
ddc0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
ddd0: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
dde0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
ddf0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
de00: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
de10: 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65  oad;.      pPage
de20: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
de30: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
de40: 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d  NoPayload;.    }
de50: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
de60: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
de70: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
de80: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
de90: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
dea0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
deb0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
dec0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
ded0: 46 3a 20 52 2d 32 37 32 32 35 2d 35 33 39 33 36  F: R-27225-53936
dee0: 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 6d 65   A value of 2 me
def0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
df00: 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20  an interior.    
df10: 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  ** index b-tree 
df20: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
df30: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
df40: 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a  TA)==2 );.    /*
df50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
df60: 31 36 35 37 31 2d 31 31 36 31 35 20 41 20 76 61  16571-11615 A va
df70: 6c 75 65 20 6f 66 20 31 30 20 6d 65 61 6e 73 20  lue of 10 means 
df80: 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65  the page is a le
df90: 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  af.    ** index 
dfa0: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
dfb0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
dfc0: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
dfd0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
dfe0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
dff0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
e000: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e010: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
e020: 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  d = 0;.    pPage
e030: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
e040: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
e050: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
e060: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
e070: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
e080: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
e090: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
e0a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e0b0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e0c0: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
e0d0: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
e0e0: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
e0f0: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
e100: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
e110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e120: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
e130: 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74    pPage->max1byt
e140: 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e  ePayload = pBt->
e150: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b  max1bytePayload;
e160: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e170: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
e180: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
e190: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
e1a0: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
e1b0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
e1c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
e1d0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
e1e0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
e1f0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
e200: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
e210: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
e220: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
e230: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
e240: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
e250: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
e260: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
e270: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
e280: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
e290: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
e2a0: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
e2b0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
e2c0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
e2d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e2e0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  btreeInitPage(Me
e2f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
e300: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e310: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
e320: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
e330: 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
e340: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e350: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e360: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
e370: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
e380: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
e390: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
e3a0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
e3b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
e3c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e3d0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
e3e0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e3f0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
e400: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
e410: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
e420: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
e430: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
e440: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
e450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e460: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
e470: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
e480: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
e490: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
e4a0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
e4b0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
e4c0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
e4d0: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
e4e0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
e4f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
e500: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
e510: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
e520: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
e530: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
e540: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
e550: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
e560: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
e570: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
e580: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
e590: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
e5a0: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
e5b0: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
e5c0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
e5d0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
e5e0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
e5f0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
e600: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
e610: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
e620: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
e630: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
e640: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
e650: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
e660: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
e670: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
e680: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
e690: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
e6a0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
e6b0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
e6c0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
e6d0: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
e6e0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
e6f0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
e700: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
e710: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
e720: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e730: 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30  F: R-28594-02890
e740: 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c   The one-byte fl
e750: 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69  ag at offset 0 i
e760: 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a  ndicating.    **
e770: 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
e780: 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66   type. */.    if
e790: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
e7a0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
e7b0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e7c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
e7d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
e7e0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
e7f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
e800: 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67  5536 );.    pPag
e810: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
e820: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
e830: 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67  e - 1);.    pPag
e840: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
e850: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
e860: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
e870: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
e880: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
e890: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38  Offset = hdr + 8
e8a0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
e8b0: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  trSize;.    pPag
e8c0: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
e8d0: 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b  ata[usableSize];
e8e0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  .    pPage->aCel
e8f0: 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
e900: 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50  lOffset];.    pP
e910: 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
e920: 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
e930: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20  ildPtrSize];.   
e940: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e950: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
e960: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
e970: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
e980: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a  designates.    *
e990: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
e9a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
e9b0: 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c  area. A zero val
e9c0: 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65  ue for this inte
e9d0: 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e  ger is.    ** in
e9e0: 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
e9f0: 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d  36. */.    top =
ea00: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
ea10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
ea20: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
ea30: 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37  OF: R-37002-3277
ea40: 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  4 The two-byte i
ea50: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
ea60: 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   3 gives the.   
ea70: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65   ** number of ce
ea80: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  lls on the page.
ea90: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   */.    pPage->n
eaa0: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
eab0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
eac0: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
ead0: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
eae0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
eaf0: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
eb00: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
eb10: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
eb20: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
eb30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
eb40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
eb50: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
eb60: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
eb70: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
eb80: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
eb90: 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
eba0: 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
ebb0: 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
ebc0: 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20  ich is only.    
ebd0: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
ebe0: 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
ebf0: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
ec00: 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
ec10: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66  en the.    ** of
ec20: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
ec30: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
ec40: 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
ec50: 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
ec60: 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
ec70: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
ec80: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ec90: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
eca0: 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
ecb0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
ecc0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
ecd0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
ece0: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
ecf0: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
ed00: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
ed10: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
ed20: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
ed30: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
ed40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
ed50: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
ed60: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
ed70: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
ed80: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
ed90: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
eda0: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
edb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
edc0: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
edd0: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
ede0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
edf0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
ee00: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
ee10: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
ee20: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
ee30: 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20  ze - 4;.    if( 
ee40: 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
ee50: 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
ee60: 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ck ){.      int 
ee70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
ee80: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
ee90: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
eea0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
eeb0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
eec0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
eed0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
eee0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
eef0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
ef00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
ef10: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
ef20: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
ef30: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74  byteAligned(&dat
ef40: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
ef50: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
ef60: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
ef70: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
ef80: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
ef90: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
efa0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
efb0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
efc0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
efd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
efe0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
eff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f000: 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
f010: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
f020: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
f030: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
f040: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
f050: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73          if( pc+s
f060: 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
f070: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f080: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f090: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
f0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f0b0: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
f0c0: 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
f0d0: 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f    }  ..    /* Co
f0e0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
f0f0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
f100: 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56  e page.    ** EV
f110: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
f120: 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
f130: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
f140: 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
f150: 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  the.    ** start
f160: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
f170: 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
f180: 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
f190: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
f1a0: 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b      ** freeblock
f1b0: 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  s. */.    pc = g
f1c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
f1d0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
f1e0: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
f1f0: 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
f200: 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
f210: 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
f220: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
f230: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
f240: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
f250: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
f260: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
f270: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
f280: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f290: 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e  R-55530-52930 In
f2a0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
f2b0: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72  -tree page, ther
f2c0: 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e will.        *
f2d0: 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
f2e0: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
f2f0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
f300: 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
f310: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
f320: 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63  Or, the freebloc
f330: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64  k is off the end
f340: 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20   of the page.   
f350: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f370: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f380: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
f390: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f3a0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
f3b0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
f3c0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
f3d0: 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20   if( (next>0 && 
f3e0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29  next<=pc+size+3)
f3f0: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
f400: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
f410: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
f420: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
f430: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64  nding order. And
f440: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
f450: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
f460: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
f470: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
f480: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
f490: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f4a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f4b0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
f4c0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
f4d0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
f4e0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
f4f0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
f500: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
f510: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
f520: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
f530: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
f540: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
f550: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
f560: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
f570: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
f580: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
f590: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
f5a0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
f5b0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
f5c0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
f5d0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
f5e0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
f5f0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
f600: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
f610: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
f620: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
f630: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
f640: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
f650: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
f660: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
f670: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
f680: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
f690: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f6a0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
f6b0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
f6c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f6d0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
f6e0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
f6f0: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
f700: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
f710: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
f720: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
f730: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f740: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
f750: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
f760: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
f770: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
f780: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
f790: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
f7a0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
f7b0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
f7c0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
f7d0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
f7e0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
f7f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f800: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
f810: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
f820: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
f830: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
f840: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
f850: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
f860: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
f870: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
f880: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
f890: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
f8a0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
f8b0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
f8c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
f8d0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
f8e0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
f8f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f900: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
f910: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
f920: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
f930: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f940: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f950: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
f960: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
f970: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
f980: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
f990: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
f9a0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
f9b0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
f9c0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
f9d0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
f9e0: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
f9f0: 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
fa00: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
fa10: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
fa20: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
fa30: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
fa40: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
fa50: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
fa60: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
fa70: 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
fa80: 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
fa90: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
faa0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
fab0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
fac0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
fad0: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
fae0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
faf0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
fb00: 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
fb10: 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
fb20: 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
fb30: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
fb40: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
fb50: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
fb60: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
fb70: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
fb80: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
fb90: 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
fba0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
fbb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
fbc0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
fbd0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
fbe0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
fbf0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
fc00: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
fc10: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
fc20: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
fc30: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
fc40: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
fc50: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
fc60: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
fc70: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
fc80: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
fc90: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
fca0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
fcb0: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
fcc0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
fcd0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
fce0: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
fcf0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
fd00: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
fd10: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
fd20: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
fd30: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
fd40: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
fd50: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
fd60: 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
fd70: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
fd80: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
fd90: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
fda0: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
fdb0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
fdc0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
fdd0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
fde0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20  ents if needed. 
fdf0: 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65   See also: btree
fe00: 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e  GetUnusedPage().
fe10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41  .**.** If the PA
fe20: 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
fe30: 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  T flag is set, i
fe40: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
fe50: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61  do not care.** a
fe60: 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
fe70: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
fe80: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
fe90: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
fea0: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
feb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
fec0: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
fed0: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
fee0: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
fef0: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
ff00: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
ff10: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
ff20: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
ff30: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
ff40: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
ff50: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
ff60: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
ff70: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
ff80: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
ff90: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
ffa0: 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
ffb0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
ffc0: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
ffd0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
ffe0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
fff0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
10000 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
10010 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10020 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
10030 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
10040 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
10050 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
10060 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
10070 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
10080 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
10090 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
100a0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
100b0 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
100c0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
100d0 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
100e0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
100f0 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
10100 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
10110 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10120 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10130 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
10140 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
10150 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
10160 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
10170 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
10180 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
10190 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
101a0 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
101b0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
101c0 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
101d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
101e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
101f0 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
10200 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
10210 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
10220 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
10230 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
10240 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
10250 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
10260 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
10270 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
10280 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
10290 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
102a0 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
102b0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
102c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
102d0 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
102e0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
102f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10300 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10310 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
10320 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
10330 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
10340 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
10350 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
10360 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
10370 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
10380 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
10390 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
103a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
103b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
103c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
103d0 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
103e0 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
103f0 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
10400 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
10410 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
10420 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
10430 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
10440 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
10450 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
10460 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
10470 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
10480 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
10490 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
104a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
104b0 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
104c0 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
104d0 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50  .  return btreeP
104e0 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29  agecount(p->pBt)
104f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
10500 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10510 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
10520 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ize it..**.** If
10530 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68   pCur!=0 then th
10540 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
10550 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20  fetched as part 
10560 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  of a moveToChild
10570 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20  ().** call.  Do 
10580 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
10590 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
105a0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
105b0 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74  ase..** And if t
105c0 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20  he fetch fails, 
105d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
105e0 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72  t decrement pCur
105f0 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ->iPage..**.** T
10600 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68  he page is fetch
10610 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65  ed as read-write
10620 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20   unless pCur is 
10630 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a  not NULL and is.
10640 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  ** a read-only c
10650 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
10660 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10670 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
10680 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
10690 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
106a0 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
106b0 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
106c0 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
106d0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
106e0 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
106f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10710 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
10720 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
10730 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
10740 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10750 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
10760 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
10770 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
10780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
10790 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
107a0 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74  ter here */.  Bt
107b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107d0 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69   Cursor to recei
107e0 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  ve the page, or 
107f0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52  NULL */.  int bR
10800 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20  eadOnly         
10810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10820 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
10830 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  y page */.){.  i
10840 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
10850 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
10860 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10870 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10880 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
10890 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67  pCur==0 || ppPag
108a0 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e==&pCur->apPage
108b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
108c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
108d0 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
108e0 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
108f0 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
10900 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
10910 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
10920 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
10930 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
10940 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10950 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10960 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
10970 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
10980 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10990 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
109a0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
109b0 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
109c0 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a  ge, bReadOnly);.
109d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
109e0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
109f0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
10a00 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10a10 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10a20 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10a30 74 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61  t);.  if( (*ppPa
10a40 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
10a50 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
10a60 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
10a70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10a80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10a90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
10aa0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f  pPage);.      go
10ab0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
10ac0 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
10ad0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61   }..  /* If obta
10ae0 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
10af0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
10b00 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
10b10 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
10b20 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
10b30 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
10b40 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
10b50 75 72 0a 20 20 20 26 26 20 28 28 2a 70 70 50 61  ur.   && ((*ppPa
10b60 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
10b70 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
10b80 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
10b90 65 79 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  ey).  ){.    rc 
10ba0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10bb0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61  _BKPT;.    relea
10bc0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
10bd0 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
10be0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
10bf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10c00 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
10c10 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20  nitPage_error:. 
10c20 20 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72   if( pCur ) pCur
10c30 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73  ->iPage--;.  tes
10c40 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
10c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
10c60 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
10c70 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
10c80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10c90 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
10ca0 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
10cb0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
10cc0 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
10cd0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
10ce0 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
10cf0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
10d00 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
10d10 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
10d20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
10d30 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
10d40 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
10d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10d60 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
10d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10d80 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
10d90 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
10da0 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
10db0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10dc0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
10dd0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
10de0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
10df0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10e00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
10e10 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10e20 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10e30 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
10e40 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
10e50 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
10e60 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
10e70 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
10e80 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
10e90 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
10ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
10eb0 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a  n unused page..*
10ec0 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
10ed0 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47  just like btreeG
10ee0 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68  etPage() with th
10ef0 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a  e addition:.**.*
10f00 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61  *   *  If the pa
10f10 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
10f20 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74   use for some ot
10f30 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d  her purpose, imm
10f40 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
10f50 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20   release it and 
10f60 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
10f70 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a  _CURRUPT error..
10f80 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72  **   *  Make sur
10f90 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61  e the isInit fla
10fa0 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74  g is clear.*/.st
10fb0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
10fc0 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42  tUnusedPage(.  B
10fd0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
10fe0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
10ff0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
11000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11010 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
11020 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
11030 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
11040 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
11050 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
11060 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
11070 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
11080 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
11090 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
110a0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
110b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
110c0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
110d0 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
110e0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
110f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11100 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
11110 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
11120 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
11130 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
11140 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
11150 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
11160 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
11170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11180 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
11190 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
111a0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
111b0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
111c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
111d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
111e0 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
111f0 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
11200 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
11210 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
11220 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
11230 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
11240 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
11250 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
11260 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
11270 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
11280 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
11290 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
112a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
112b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
112c0 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
112d0 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
112e0 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
112f0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
11300 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
11310 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
11320 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
11330 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
11340 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
11350 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
11360 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
11370 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
11380 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
11390 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
113a0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
113b0 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
113c0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
113d0 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
113e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
113f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
11410 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
11420 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
11430 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
11440 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
11450 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
11460 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
11470 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
11480 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
11490 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
114a0 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
114b0 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
114c0 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
114d0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
114e0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
114f0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
11500 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
11510 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11520 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
11530 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
11540 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
11550 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
11560 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
11570 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
11580 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
11590 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
115a0 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
115b0 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
115c0 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
115d0 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
115e0 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
115f0 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
11600 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
11610 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
11620 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
11630 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
11640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11650 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
11660 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
11670 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11680 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
11690 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
116a0 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
116b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
116c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
116d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
116e0 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
116f0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
11700 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
11710 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
11720 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
11730 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
11740 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
11750 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11760 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
11770 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
11780 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
11790 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
117a0 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
117b0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
117c0 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
117d0 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
117e0 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
117f0 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
11800 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
11810 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
11820 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
11830 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
11840 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
11850 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
11860 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
11870 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
11880 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
11890 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
118a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
118b0 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
118c0 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
118d0 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
118e0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
118f0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
11900 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
11910 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
11920 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
11930 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
11940 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
11950 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
11960 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
11970 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
11980 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
11990 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
119a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
119b0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
119c0 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
119d0 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
119e0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
119f0 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
11a00 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
11a10 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
11a20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
11a30 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
11a40 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
11a50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11a60 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
11a70 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
11a80 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
11a90 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
11aa0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
11ab0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
11ac0 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
11ad0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
11ae0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
11af0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
11b00 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
11b10 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
11b20 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
11b30 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
11b40 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11b50 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
11b60 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11b70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
11b80 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
11b90 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
11ba0 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
11bb0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
11bc0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
11bd0 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
11be0 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
11bf0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
11c00 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
11c10 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
11c20 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
11c30 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
11c40 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
11c50 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
11c60 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
11c70 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
11c80 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
11c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
11ca0 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
11cb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
11cc0 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
11cd0 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
11ce0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
11cf0 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
11d00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11d10 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
11d20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11d30 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
11d40 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
11d50 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
11d60 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
11d70 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
11d80 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
11d90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
11da0 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
11db0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
11dc0 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
11dd0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
11de0 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
11df0 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
11e00 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
11e10 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
11e20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
11e30 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
11e40 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
11e50 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
11e60 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
11e70 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
11e80 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
11e90 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
11ea0 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
11eb0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
11ec0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
11ed0 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
11ee0 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
11ef0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
11f00 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
11f10 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
11f20 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
11f30 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
11f40 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
11f50 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
11f60 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
11f70 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
11f80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
11f90 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
11fa0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
11fb0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
11fc0 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
11fd0 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
11fe0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11ff0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
12000 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12010 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
12020 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
12030 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
12040 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
12050 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
12060 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
12070 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
12080 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
12090 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
120a0 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
120b0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
120c0 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
120d0 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
120e0 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
120f0 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
12100 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
12110 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
12120 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
12130 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
12140 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
12150 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
12160 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
12170 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
12180 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12190 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
121a0 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
121b0 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
121c0 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
121d0 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
121e0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
121f0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
12200 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
12210 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
12220 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
12230 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
12240 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12250 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
12260 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
12270 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
12280 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
12290 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
122a0 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
122b0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
122c0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
122d0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
122e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
122f0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
12300 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
12310 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
12320 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
12330 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
12340 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
12350 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
12360 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
12370 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
12380 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
12390 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
123a0 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
123b0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
123c0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
123d0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
123e0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
123f0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
12400 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12410 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
12420 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
12430 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
12440 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
12450 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
12460 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
12470 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
12480 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
12490 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
124a0 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
124b0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
124c0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
124d0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
124e0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
124f0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
12500 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
12510 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
12520 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
12530 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12540 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12550 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12560 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
12570 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
12580 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
12590 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
125a0 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
125b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
125c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
125d0 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
125e0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
12620 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
12630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12650 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
12660 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
12670 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12680 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
12690 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
126a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
126b0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
126c0 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
126d0 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
126e0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
126f0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
12700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12710 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
12720 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
12730 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
12740 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12750 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12760 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
12770 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12780 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
12790 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
127a0 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
127b0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
127c0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
127d0 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
127e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
127f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
12800 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
12810 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
12820 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
12830 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
12840 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
12850 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12860 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
12870 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
12880 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
12890 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
128a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
128b0 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
128c0 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
128d0 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
128e0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
128f0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
12900 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
12910 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
12920 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
12930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
12940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12950 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
12960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
12970 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12980 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
129a0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
129b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
129c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
129d0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
129e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
129f0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
12a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
12a10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12a20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
12a30 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
12a40 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
12a50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12a60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12a70 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12a80 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
12a90 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
12aa0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
12ab0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
12ac0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
12ad0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
12ae0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
12af0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
12b00 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
12b10 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
12b20 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
12b30 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
12b40 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
12b50 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
12b60 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
12b70 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
12b80 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
12b90 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
12ba0 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
12bb0 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
12bc0 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
12bd0 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
12be0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
12bf0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
12c00 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
12c10 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
12c20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
12c30 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
12c40 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
12c50 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
12c60 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
12c70 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
12c80 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
12c90 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
12ca0 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
12cb0 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
12cc0 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
12cd0 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
12ce0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
12cf0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12d00 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
12d10 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
12d20 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
12d30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
12d40 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
12d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
12d60 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
12d70 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
12d80 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
12d90 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
12da0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
12db0 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
12dc0 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
12dd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12de0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
12df0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
12e00 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
12e10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
12e20 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
12e30 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
12e40 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
12e60 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
12e70 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65  vfsFlags, pageRe
12e80 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72  init);.    if( r
12e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
12eb0 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
12ec0 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e  Bt->pPager, db->
12ed0 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72  szMmap);.      r
12ee0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12ef0 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
12f00 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
12f10 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
12f20 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
12f30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
12f50 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
12f60 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
12f70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75  ->openFlags = (u
12f80 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74  8)flags;.    pBt
12f90 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
12fa0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
12fb0 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
12fc0 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
12fd0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
12fe0 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
12ff0 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42  = pBt;.  .    pB
13000 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
13010 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
13020 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
13030 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
13040 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
13050 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
13060 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
13070 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  Y;.#ifdef SQLITE
13080 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
13090 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
130a0 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
130b0 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  ELETE;.#endif.  
130c0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
130d0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
130e0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
130f0 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
13100 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
13110 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
13120 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
13130 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
13140 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
13150 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
13160 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
13170 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
13180 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
13190 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b  ze = (zDbHeader[
131a0 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65  16]<<8) | (zDbHe
131b0 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  ader[17]<<16);. 
131c0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
131d0 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
131e0 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
131f0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
13200 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
13210 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
13220 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
13230 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
13240 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
13250 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13260 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
13270 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
13280 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
13290 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
132a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
132b0 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
132c0 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
132d0 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
132e0 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
132f0 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
13300 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
13310 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
13320 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
13330 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
13340 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
13350 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
13360 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
13370 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
13380 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
13390 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
133a0 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
133b0 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
133c0 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
133d0 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
133e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
133f0 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
13400 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
13410 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
13420 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
13430 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
13440 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
13450 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
13460 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
13470 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
13480 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
13490 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
134a0 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
134b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45  else{.      /* E
134c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
134d0 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
134e0 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
134f0 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
13500 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13510 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
13520 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
13530 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
13540 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20  fset of 20.     
13550 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74   ** into the dat
13560 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
13570 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73  r. */.      nRes
13580 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
13590 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
135a0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
135b0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
135c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
135d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
135e0 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
135f0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
13600 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
13610 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
13620 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
13630 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
13640 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
13650 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
13660 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
13670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
13680 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
13690 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
136a0 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
136b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
136c0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
136d0 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ut;.    pBt->usa
136e0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
136f0 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
13700 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
13710 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
13720 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
13730 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
13740 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
13750 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
13760 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13770 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
13780 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13790 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
137a0 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
137b0 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
137c0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
137d0 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
137e0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
137f0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
13800 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13810 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
13820 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
13830 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ).      pBt->nRe
13840 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54  f = 1;.      MUT
13850 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
13860 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
13870 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13880 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
13890 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
138a0 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
138b0 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
138c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
138d0 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
138e0 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
138f0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13900 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
13910 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
13920 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
13930 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13940 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13950 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
13960 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
13970 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
13980 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
139a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
139b0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
139c0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
139d0 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
139e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
139f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
13a00 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
13a10 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
13a20 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
13a30 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
13a40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13a50 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
13a60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13a70 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
13a80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
13a90 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
13aa0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13ab0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
13ac0 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
13ad0 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
13ae0 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
13af0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
13b00 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
13b10 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
13b20 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
13b30 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
13b40 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
13b50 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
13b60 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
13b70 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
13b80 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
13b90 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
13ba0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
13bb0 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
13bc0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
13bd0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
13be0 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
13bf0 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
13c00 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
13c10 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
13c20 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
13c30 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
13c40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
13c50 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
13c60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
13c70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
13c80 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
13c90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
13ca0 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
13cb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13cc0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
13cd0 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
13ce0 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
13cf0 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
13d00 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
13d10 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
13d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13d30 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
13d40 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
13d50 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
13d60 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
13d70 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
13d80 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
13d90 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
13da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13db0 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
13dc0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
13dd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13de0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13df0 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
13e00 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
13e10 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
13e20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13e30 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
13e40 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
13e50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
13e60 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
13e70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
13e80 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
13e90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13ea0 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
13eb0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
13ec0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
13ed0 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
13ee0 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
13ef0 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
13f00 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
13f10 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
13f20 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
13f30 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
13f40 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
13f50 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
13f60 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
13f70 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
13f80 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
13f90 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
13fa0 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
13fb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
13fc0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
13fd0 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
13fe0 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
13ff0 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
14000 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
14010 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
14020 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14030 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
14040 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
14050 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14060 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
14070 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
14090 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
140a0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
140b0 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
140c0 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
140d0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
140e0 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
140f0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
14100 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
14110 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
14120 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
14130 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
14140 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
14150 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
14160 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
14170 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
14180 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
14190 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
141a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
141b0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
141c0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
141d0 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
141e0 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
141f0 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
14200 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
14210 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14220 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
14230 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
14240 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
14250 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
14260 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14270 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
14280 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
14290 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
142a0 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
142b0 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
142c0 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
142d0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
142e0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
142f0 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
14300 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
14310 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14320 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14330 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
14340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14350 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
14360 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14370 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14380 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
14390 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
143a0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
143b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
143c0 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
143d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
143e0 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
143f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
14400 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
14410 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
14420 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
14430 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
14440 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14450 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
14460 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
14470 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
14480 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
14490 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
144a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
144b0 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
144c0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
144d0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
144e0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
144f0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
14500 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
14510 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
14520 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d   bytes with a 4-
14530 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20  byte prefix for 
14540 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20  a left-child.** 
14550 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
14560 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
14570 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
14580 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
14590 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
145a0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
145b0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
145c0 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
145d0 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
145e0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
145f0 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
14600 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
14610 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
14620 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
14630 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
14640 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
14650 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
14660 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
14670 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
14680 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
14690 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
146a0 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
146b0 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
146c0 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
146d0 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
146e0 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
146f0 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
14700 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
14710 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
14720 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
14730 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
14740 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
14750 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
14760 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
14770 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
14780 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
14790 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
147a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
147b0 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
147c0 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
147d0 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
147e0 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
147f0 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
14800 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
14810 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
14820 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
14830 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
14840 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
14850 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
14860 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
14870 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a  emp space here..
14880 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
14890 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75  so:  Provide fou
148a0 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69  r bytes of initi
148b0 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66  alized space bef
148c0 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  ore the.    ** b
148d0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70  eginning of pTmp
148e0 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61  Space as an area
148f0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72   available to pr
14900 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  epend the.    **
14910 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e   left-child poin
14920 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ter to the begin
14930 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a  ning of a cell..
14940 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14950 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
14960 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
14970 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c  t->pTmpSpace, 0,
14980 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   8);.      pBt->
14990 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a  pTmpSpace += 4;.
149a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
149b0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
149c0 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
149d0 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
149e0 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
149f0 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
14a00 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54  ){.  if( pBt->pT
14a10 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
14a20 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d  Bt->pTmpSpace -=
14a30 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   4;.    sqlite3P
14a40 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d  ageFree(pBt->pTm
14a50 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74  pSpace);.    pBt
14a60 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
14a70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
14a80 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
14a90 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
14aa0 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
14ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14ac0 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
14ad0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
14ae0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
14af0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
14b00 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
14b10 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
14b20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
14b30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
14b40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14b50 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
14b60 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14b70 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
14b80 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
14b90 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
14ba0 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
14bb0 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
14bc0 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
14bd0 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
14be0 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
14bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
14c00 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
14c10 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
14c20 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
14c30 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
14c40 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
14c50 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
14c60 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
14c70 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
14c80 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
14c90 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
14ca0 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
14cb0 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
14cc0 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
14cd0 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49  Rollback(p, SQLI
14ce0 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
14cf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14d00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
14d10 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
14d20 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
14d30 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
14d40 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
14d50 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
14d60 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
14d70 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
14d80 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
14d90 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
14da0 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
14db0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
14dc0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
14dd0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
14de0 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
14df0 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
14e00 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
14e10 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
14e20 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
14e30 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
14e40 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
14e50 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
14e60 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
14e70 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
14e80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
14e90 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
14ea0 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
14eb0 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
14ec0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
14ed0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
14ee0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
14ef0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
14f00 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
14f10 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
14f20 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
14f30 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
14f40 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
14f50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14f60 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
14f70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
14f80 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
14f90 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
14fa0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
14fb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14fc0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14fd0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
14fe0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
14ff0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
15000 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
15010 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
15020 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
15030 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
15040 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
15050 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
15060 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
15070 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
15080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
150a0 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
150b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
150c0 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
150d0 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
150e0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
150f0 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
15100 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
15110 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
15120 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
15130 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
15140 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
15150 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
15160 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
15170 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
15180 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
15190 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
151a0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
151b0 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
151c0 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
151d0 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
151e0 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
151f0 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
15200 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
15210 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
15220 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
15230 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
15240 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
15250 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
15260 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
15270 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
15280 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
15290 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
152a0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
152b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
152c0 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
152d0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
152e0 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
152f0 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
15300 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
15310 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
15320 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
15330 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
15340 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
15350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15360 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
15370 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
15380 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15390 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
153a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
153b0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
153c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
153d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
153e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
153f0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
15400 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
15410 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
15420 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15440 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
15450 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
15460 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
15470 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75  imit on the amou
15480 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nt of the databa
15490 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79  se file that may
154a0 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61   be.** memory ma
154b0 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pped..*/.int sql
154c0 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70  ite3BtreeSetMmap
154d0 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20  Limit(Btree *p, 
154e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
154f0 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  Mmap){.  BtShare
15500 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15510 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15520 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
15530 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15540 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15550 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
15560 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
15570 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  t(pBt->pPager, s
15580 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  zMmap);.  sqlite
15590 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
155a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
155b0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
155c0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
155d0 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
155e0 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
155f0 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
15600 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
15610 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
15620 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
15630 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
15640 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
15650 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
15660 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
15670 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
15680 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
15690 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
156a0 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
156b0 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
156c0 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
156d0 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
156e0 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
156f0 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
15700 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
15710 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
15720 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
15730 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
15740 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
15750 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
15760 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
15770 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
15780 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
15790 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
157a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
157b0 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
157c0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
157d0 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65  gerFlags(.  Btre
157e0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
157f0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
15800 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
15810 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
15820 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
15830 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
15840 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20  s PAGER_* flags 
15850 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
15860 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15880 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15890 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
158a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
158b0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
158c0 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
158d0 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67  ->pPager, pgFlag
158e0 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
158f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15910 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15920 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
15930 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
15940 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
15950 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
15960 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
15970 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
15980 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
15990 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
159a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
159b0 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
159c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
159d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
159e0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
159f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15a00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
15a10 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
15a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15a30 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
15a40 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
15a50 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
15a60 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
15a70 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15a90 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15aa0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
15ab0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
15ac0 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
15ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
15ae0 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
15af0 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
15b00 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
15b10 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
15b20 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
15b30 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
15b40 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
15b50 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
15b60 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
15b70 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
15b80 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
15b90 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
15ba0 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
15bb0 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
15bc0 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
15bd0 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
15be0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
15bf0 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
15c00 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
15c10 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
15c20 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
15c30 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
15c40 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
15c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
15c60 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
15c70 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
15c80 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
15c90 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
15ca0 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
15cb0 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
15cc0 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
15cd0 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
15ce0 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
15cf0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15d00 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
15d10 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
15d20 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
15d30 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
15d40 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
15d50 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
15d60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
15d70 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
15d80 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
15d90 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
15da0 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
15db0 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
15dc0 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
15dd0 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
15de0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15df0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
15e00 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
15e10 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
15e20 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
15e30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15e40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
15e50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15e60 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
15e70 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
15e80 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
15e90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15ea0 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  r(p);.#if SQLITE
15eb0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
15ec0 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f   nReserve>pBt->o
15ed0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
15ee0 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
15ef0 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72  rve = (u8)nReser
15f00 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ve;.#endif.  if(
15f10 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
15f20 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
15f30 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
15f40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15f50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15f60 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
15f70 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
15f80 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
15f90 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
15fa0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
15fb0 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
15fc0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
15fd0 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
15fe0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
15ff0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
16000 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
16010 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
16020 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
16030 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
16040 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
16050 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
16060 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16070 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
16080 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
16090 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
160a0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
160b0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
160c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
160d0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
160e0 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
160f0 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
16100 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
16110 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
16120 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
16130 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
16140 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
16150 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
16160 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
16170 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16180 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16190 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
161a0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
161b0 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
161c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
161d0 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
161e0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
161f0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
16200 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
16210 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
16220 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
16230 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
16240 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
16250 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
16260 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
16270 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16280 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
16290 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
162a0 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
162b0 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
162c0 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
162d0 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
162e0 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
162f0 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
16300 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
16310 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
16320 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
16330 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
16340 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
16350 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
16360 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
16370 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16380 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
16390 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
163a0 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
163b0 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
163c0 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
163d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
163e0 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
163f0 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
16400 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
16410 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16420 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
16430 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16440 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16450 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16460 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
16470 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
16480 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
16490 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
164a0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
164b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
164c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
164d0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
164e0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
164f0 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
16500 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
16510 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
16520 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
16530 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
16540 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
16550 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a  extensions..**.*
16560 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  * If SQLITE_HAS_
16570 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64  MUTEX is defined
16580 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
16590 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
165a0 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74  .** greater of t
165b0 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72  he current reser
165c0 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68  ved space and th
165d0 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73  e maximum reques
165e0 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73  ted.** reserve s
165f0 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pace..*/.int sql
16600 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69  ite3BtreeGetOpti
16610 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65  malReserve(Btree
16620 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
16630 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16640 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
16650 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
16660 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23  rveNoMutex(p);.#
16670 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16680 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70  _CODEC.  if( n<p
16690 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
166a0 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70  serve ) n = p->p
166b0 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
166c0 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  ve;.#endif.  sql
166d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
166e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
166f0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  .../*.** Set the
16700 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16710 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
16720 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
16730 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
16740 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
16750 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
16760 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
16770 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
16780 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
16790 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
167a0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
167b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
167c0 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
167d0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
167e0 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
167f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16800 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
16810 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
16820 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
16830 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
16840 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16850 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16860 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
16870 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  et the BTS_SECUR
16880 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66  E_DELETE flag if
16890 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
168a0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
168b0 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
168c0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
168d0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
168e0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
168f0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
16900 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74  E.** setting aft
16910 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a  er the change..*
16920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16930 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
16940 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
16950 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
16960 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
16970 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
16980 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16990 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
169a0 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
169b0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
169c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
169d0 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
169e0 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
169f0 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
16a00 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62  DELETE;.  } .  b
16a10 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
16a20 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
16a30 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20  E_DELETE)!=0;.  
16a40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16a50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
16a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
16a70 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
16a80 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
16a90 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
16aa0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
16ab0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
16ac0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
16ad0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
16ae0 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
16af0 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
16b00 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
16b10 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
16b20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
16b30 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
16b40 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
16b50 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
16b60 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
16b70 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
16b80 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
16b90 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
16ba0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
16bb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
16bc0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
16bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
16be0 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
16bf0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16c00 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
16c10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
16c20 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
16c30 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
16c40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16c50 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
16c60 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
16c70 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
16c80 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
16c90 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16ca0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
16cb0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
16cc0 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
16cd0 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
16ce0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
16cf0 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
16d00 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
16d10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
16d30 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
16d40 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
16d50 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
16d60 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
16d70 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
16d80 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
16d90 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
16da0 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
16db0 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
16dc0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
16dd0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
16de0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16df0 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
16e00 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
16e10 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
16e20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16e30 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
16e40 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
16e50 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
16e60 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
16e70 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
16e80 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
16e90 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
16ea0 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
16eb0 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
16ec0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16ed0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16ee0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
16ef0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
16f00 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
16f10 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
16f20 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
16f30 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
16f40 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
16f50 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
16f60 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
16f70 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
16f80 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
16f90 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
16fa0 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
16fb0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
16fc0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
16fd0 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
16fe0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
16ff0 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
17000 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
17010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
17020 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
17030 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
17040 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
17050 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
17060 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
17070 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
17080 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
17090 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
170a0 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
170b0 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
170c0 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
170d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
170e0 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
170f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17100 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17110 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
17120 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
17130 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
17140 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
17150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
17160 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
17170 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
17180 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
17190 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
171a0 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
171b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
171c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
171d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
171e0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
171f0 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
17200 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
17210 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
17220 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17230 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17240 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
17250 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
17260 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
17270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17280 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
17290 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
172a0 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
172b0 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
172c0 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
172d0 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
172e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
172f0 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
17300 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
17310 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
17320 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
17330 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
17340 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
17350 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
17360 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
17370 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
17380 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
17390 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
173a0 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
173b0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
173c0 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
173d0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
173e0 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
173f0 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
17400 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
17410 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
17420 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17430 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
17440 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
17450 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
17460 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
17470 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
17480 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
17490 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
174a0 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
174b0 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
174c0 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
174d0 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
174e0 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
174f0 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
17500 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
17510 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
17520 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17530 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
17540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
17550 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
17560 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
17570 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17580 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
17590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
175a0 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
175b0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
175c0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
175d0 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
175e0 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
175f0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
17600 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
17610 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
17620 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
17630 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
17640 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
17660 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
17670 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
17680 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
17690 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
176a0 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
176b0 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
176c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
176d0 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
176e0 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
176f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
17700 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
17710 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
17720 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
17730 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
17740 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
17750 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
17760 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
17770 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
17780 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
17790 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
177a0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
177b0 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
177c0 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
177d0 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
177e0 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
177f0 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
17800 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
17810 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
17820 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
17830 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
17840 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
17850 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
17860 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
17870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17880 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
17890 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
178a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
178b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
178c0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
178d0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
178e0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
178f0 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
17900 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
17910 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ge1);.        re
17920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
17940 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
17950 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
17960 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17970 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
17980 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
17990 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
179a0 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
179b0 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
179c0 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
179d0 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
179e0 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
179f0 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
17a00 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
17a10 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
17a20 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
17a30 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
17a40 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
17a50 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
17a60 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
17a70 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
17a80 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
17a90 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
17aa0 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
17ab0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
17ac0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17ad0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
17ae0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
17af0 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
17b00 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
17b10 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
17b20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
17b30 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
17b40 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
17b50 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
17b60 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
17b70 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
17b80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17b90 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
17ba0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
17bb0 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
17bc0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
17bd0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
17be0 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
17bf0 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
17c00 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
17c10 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
17c20 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
17c30 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
17c40 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
17c50 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
17c60 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
17c70 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
17c80 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
17c90 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
17ca0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
17cb0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17cc0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
17cd0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
17ce0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
17cf0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
17d00 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
17d10 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
17d20 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
17d30 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
17d40 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
17d50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
17d60 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
17d70 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
17d80 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
17d90 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
17da0 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
17db0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
17dc0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
17dd0 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
17de0 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
17df0 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
17e00 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
17e10 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
17e20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
17e30 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
17e40 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
17e50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
17e60 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
17e70 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
17e80 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
17e90 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
17ea0 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
17eb0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
17ec0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
17ed0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
17ee0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
17ef0 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
17f00 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
17f10 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
17f20 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
17f30 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
17f40 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
17f50 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
17f60 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
17f70 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
17f80 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
17f90 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
17fa0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
17fb0 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
17fc0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
17fd0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
17fe0 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
17ff0 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
18000 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
18010 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18020 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
18030 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
18040 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
18050 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
18060 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
18070 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
18080 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
18090 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
180a0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
180b0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
180c0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
180f0 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
18100 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
18120 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
18130 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d  SQLITE_RecoveryM
18140 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ode)==0 && nPage
18150 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
18160 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18170 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18180 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18190 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
181a0 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
181b0 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34  E-OF: R-28312-64
181c0 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65  704 However, the
181d0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20   usable size is 
181e0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
181f0 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68     ** be less th
18200 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72  an 480. In other
18210 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70   words, if the p
18220 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c  age size is 512,
18230 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
18240 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
18250 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  size cannot exce
18260 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66  ed 32. */.    if
18270 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
18280 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
18290 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
182a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
182b0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
182c0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
182d0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
182e0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
182f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18300 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
18310 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
18320 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
18330 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
18340 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
18350 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
18360 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
18370 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
18380 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
18390 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
183a0 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
183b0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
183c0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
183d0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
183e0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
183f0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
18400 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
18410 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
18420 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
18430 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
18440 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
18450 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
18460 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
18470 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
18480 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
18490 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
184a0 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
184b0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
184c0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
184d0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
184e0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
184f0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
18500 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
18510 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
18520 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
18530 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
18540 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
18550 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
18560 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
18570 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
18580 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
18590 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
185a0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
185b0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
185c0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
185d0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
185e0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
185f0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
18600 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
18610 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
18620 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
18630 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
18640 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
18650 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
18660 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
18670 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
18680 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
18690 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
186a0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
186b0 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
186c0 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
186d0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
186e0 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
186f0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
18700 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
18710 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
18720 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18730 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
18740 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
18750 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
18760 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
18770 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
18780 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
18790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
187a0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
187b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
187c0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
187d0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
187e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
187f0 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
18800 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18810 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
18820 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
18830 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
18840 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
18850 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
18860 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
18870 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
18880 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
18890 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
188a0 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
188b0 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
188c0 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
188d0 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
188e0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
188f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
18900 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
18910 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
18920 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
18930 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
18940 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
18950 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
18960 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43  the database.  C
18970 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68  ursors that.** h
18980 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64  ave been tripped
18990 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52   into the CURSOR
189a0 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65  _FAULT state are
189b0 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f   not counted..*/
189c0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
189d0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74  tValidCursors(Bt
189e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
189f0 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75   wrOnly){.  BtCu
18a00 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
18a10 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
18a20 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
18a30 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
18a40 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
18a50 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( (wrOnly==0 ||
18a60 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
18a70 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
18a80 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70  g)!=0).     && p
18a90 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
18aa0 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
18ab0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
18ac0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
18ad0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
18ae0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
18af0 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
18b00 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
18b10 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
18b20 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
18b30 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
18b40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
18b50 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
18b60 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
18b70 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
18b80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18b90 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
18ba0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
18bb0 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
18bc0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
18bd0 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
18be0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
18bf0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
18c00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
18c10 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
18c20 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
18c30 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
18c40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18c50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18c60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18c70 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
18c80 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30  ursors(pBt,0)==0
18c90 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
18ca0 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
18cb0 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
18cc0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18cd0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
18ce0 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
18cf0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
18d00 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
18d10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
18d20 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
18d30 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
18d40 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
18d50 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
18d60 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
18d70 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  e1 = 0;.    rele
18d80 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
18d90 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Page1);.  }.}../
18da0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
18db0 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
18dc0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
18dd0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
18de0 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
18df0 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
18e00 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
18e10 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
18e20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
18e30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
18e40 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
18e50 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
18e60 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
18e70 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
18e80 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
18e90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18ea0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18eb0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
18ec0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
18ed0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18ee0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
18ef0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
18f00 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
18f10 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
18f20 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
18f30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
18f40 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
18f50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
18f60 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
18f70 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
18f80 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
18f90 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
18fa0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
18fb0 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
18fc0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
18fd0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
18fe0 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
18ff0 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
19000 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
19010 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
19020 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
19030 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
19040 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
19050 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
19060 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
19070 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
19080 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
19090 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
190a0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
190b0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
190c0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
190d0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
190e0 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
190f0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
19100 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
19110 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
19120 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
19130 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
19140 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
19150 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
19160 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
19170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
19180 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
19190 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
191a0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
191b0 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
191c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
191d0 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
191e0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
191f0 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
19200 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
19210 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
19220 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
19230 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
19240 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
19250 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
19260 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
19270 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
19280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19290 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
192a0 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
192b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
192c0 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
192d0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
192e0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
192f0 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
19300 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
19310 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
19320 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
19330 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
19340 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
19350 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
19360 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
19370 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
19380 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
19390 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
193a0 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
193b0 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
193c0 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
193d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
193e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
193f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
19400 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
19410 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
19420 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
19430 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
19440 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
19450 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
19460 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
19470 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
19480 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
19490 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
194a0 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
194b0 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
194c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
194d0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
194e0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
194f0 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
19500 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
19510 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
19520 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
19530 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
19540 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
19550 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
19560 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
19570 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
19580 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
19590 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
195a0 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
195b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
195c0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
195d0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
195e0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
195f0 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
19600 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
19610 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
19620 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19630 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
19640 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
19650 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
19660 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
19670 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19680 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
19690 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
196a0 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
196b0 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
196c0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
196d0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
196e0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
196f0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
19700 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
19710 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19720 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
19730 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19740 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
19750 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
19760 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
19770 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
19780 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
19790 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
197a0 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
197b0 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
197c0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
197d0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
197e0 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
197f0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
19800 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
19810 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
19820 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
19830 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
19840 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
19850 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
19860 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
19870 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
19880 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
19890 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
198a0 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
198b0 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
198c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
198d0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
198e0 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
198f0 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
19900 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
19910 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
19920 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
19930 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
19940 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
19950 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
19960 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
19970 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
19980 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
19990 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
199a0 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
199b0 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
199c0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
199d0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
199e0 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
199f0 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
19a00 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
19a10 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
19a20 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
19a30 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
19a40 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
19a50 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
19a60 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
19a70 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
19a80 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
19a90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19aa0 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
19ab0 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
19ac0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
19ad0 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
19ae0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19af0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
19b00 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
19b10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19b20 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
19b30 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
19b40 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
19b50 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
19b60 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
19b70 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
19b80 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
19b90 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
19ba0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
19bb0 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
19bc0 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
19bd0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
19be0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19bf0 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
19c00 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
19c10 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
19c20 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
19c30 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
19c40 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
19c50 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
19c60 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
19c70 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
19c80 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
19c90 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
19ca0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
19cb0 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
19cc0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
19cd0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
19ce0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
19cf0 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
19d00 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
19d10 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
19d20 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
19d30 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
19d40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19d50 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
19d60 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
19d70 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
19d80 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
19d90 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
19da0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
19db0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
19dc0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
19dd0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
19de0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
19df0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
19e00 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
19e10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
19e20 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
19e30 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
19e40 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
19e50 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
19e60 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
19e70 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
19e80 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
19e90 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
19ea0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
19eb0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
19ec0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
19ed0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
19ee0 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
19ef0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
19f00 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
19f10 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
19f20 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
19f30 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
19f40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19f50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
19f60 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
19f70 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
19f80 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
19f90 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
19fa0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
19fb0 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
19fc0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
19fd0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
19fe0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
19ff0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1a000 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1a010 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1a020 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1a030 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1a040 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1a050 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1a060 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1a070 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1a080 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1a090 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1a0a0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1a0b0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1a0c0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1a0d0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1a0e0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1a0f0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1a100 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1a110 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1a120 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1a130 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1a140 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1a150 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1a160 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1a170 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1a180 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1a190 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1a1a0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1a1b0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1a1c0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1a1d0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1a1e0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1a1f0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1a200 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1a210 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1a220 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1a230 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1a240 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1a250 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1a260 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1a270 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1a280 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1a290 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1a2a0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1a2b0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1a2c0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1a2d0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1a2e0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1a2f0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1a300 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1a310 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1a320 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1a330 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1a340 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1a350 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a360 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1a370 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1a380 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1a390 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1a3a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a3b0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1a3c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a3d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a3e0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1a3f0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1a400 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1a410 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1a420 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1a430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a440 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1a450 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1a460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a470 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1a480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a490 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
1a4a0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1a4b0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1a4c0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
1a4d0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
1a4e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a4f0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
1a500 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
1a510 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
1a520 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
1a530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a540 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a550 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1a560 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1a570 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1a580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1a590 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1a5a0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1a5b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1a5c0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1a5d0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1a5e0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1a5f0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1a600 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1a610 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1a620 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1a630 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1a640 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1a650 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1a660 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1a670 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1a680 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1a690 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1a6a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1a6b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a6c0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1a6d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1a6e0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1a6f0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1a700 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1a710 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1a720 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1a730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1a740 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1a750 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1a760 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1a770 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1a780 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1a790 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1a7a0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1a7b0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1a7c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a7d0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1a7e0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1a7f0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1a800 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1a810 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1a820 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1a830 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1a840 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1a850 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a860 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1a870 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1a880 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1a890 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1a8a0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1a8b0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1a8c0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1a8d0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1a8e0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1a8f0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1a900 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1a910 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1a920 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1a930 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a940 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1a950 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1a960 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1a970 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1a980 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a990 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a9a0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1a9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1a9c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a9d0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1a9e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1a9f0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1aa00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1aa10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1aa20 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
1aa30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aa40 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1aa50 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1aa60 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
1aa70 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
1aa80 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
1aa90 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
1aaa0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
1aab0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1aac0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
1aad0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
1aae0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1aaf0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1ab00 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1ab10 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1ab20 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
1ab30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1ab40 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1ab50 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
1ab60 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
1ab70 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1ab80 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
1ab90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1aba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1abb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1abc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
1abd0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
1abe0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
1abf0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
1ac00 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
1ac10 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
1ac20 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
1ac30 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
1ac40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1ac50 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
1ac60 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
1ac70 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
1ac80 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
1ac90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1aca0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
1acb0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1acc0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ace0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
1acf0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
1ad00 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
1ad30 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
1ad40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1ad70 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
1ad80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1ad90 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
1ada0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
1adb0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
1adc0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1add0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1ade0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1adf0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1ae00 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1ae10 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1ae20 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1ae30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ae40 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
1ae50 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
1ae60 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1ae70 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1ae80 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1ae90 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1aea0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1aeb0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1aec0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1aed0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1aee0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1aef0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1af00 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1af10 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1af20 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1af30 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1af40 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1af50 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1af60 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1af70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1af80 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1af90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1afa0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1afb0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1afc0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1afd0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1afe0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1aff0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
1b000 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
1b010 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
1b020 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
1b030 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b040 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1b050 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1b060 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1b070 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1b080 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1b090 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1b0a0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1b0b0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1b0c0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1b0d0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1b0e0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1b0f0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1b100 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1b110 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1b120 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1b130 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1b140 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1b150 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1b160 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1b170 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1b180 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1b190 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1b1a0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1b1b0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b1d0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1b1e0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1b1f0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1b200 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1b210 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1b220 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1b230 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1b240 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1b250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b260 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1b270 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1b280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1b290 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1b2a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1b2b0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1b2c0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1b2d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b2e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1b2f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1b300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1b310 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1b320 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1b330 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1b340 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1b350 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1b360 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1b370 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1b380 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1b390 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1b3a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1b3b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1b3c0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1b3d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b3e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1b3f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1b400 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1b410 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1b420 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
1b430 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
1b440 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
1b450 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
1b460 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72    int rc;..    r
1b470 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1b480 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1b490 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b4a0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1b4b0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1b4c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1b4d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1b4e0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1b4f0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1b500 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1b510 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1b520 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1b530 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1b540 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1b550 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1b560 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1b570 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
1b580 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26  rflow.         &
1b590 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  & pCell+info.iOv
1b5a0 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d  erflow+3<=pPage-
1b5b0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
1b5c0 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
1b5d0 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
1b5e0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1b5f0 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20  Overflow]).     
1b600 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1b610 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
1b620 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
1b630 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1b640 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b650 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1b660 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
1b670 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
1b680 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
1b690 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
1b6a0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1b6b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1b6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b6d0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
1b6e0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
1b6f0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
1b700 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
1b710 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1b720 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1b730 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
1b740 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
1b750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1b760 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1b770 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1b780 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1b790 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1b7a0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1b7b0 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
1b7c0 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
1b7d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1b7e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1b7f0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
1b800 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1b810 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
1b820 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
1b830 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
1b840 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
1b850 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
1b860 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
1b870 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
1b880 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1b890 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
1b8a0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1b8b0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1b8c0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
1b8d0 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
1b8e0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1b8f0 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
1b900 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
1b910 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1b920 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
1b930 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
1b940 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
1b950 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
1b960 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
1b970 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1b980 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
1b990 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
1b9a0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
1b9b0 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
1b9c0 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b9e0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
1b9f0 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
1ba00 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1ba10 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
1ba20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1ba30 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
1ba40 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1ba50 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
1ba60 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
1ba70 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
1ba80 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
1ba90 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1baa0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1bab0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
1bac0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1bad0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
1bae0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1baf0 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
1bb00 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1bb10 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1bb20 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
1bb30 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
1bb40 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
1bb50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1bb60 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
1bb70 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1bb80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1bb90 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
1bba0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1bbb0 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
1bbc0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1bbd0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1bbe0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
1bbf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bc00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1bc10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1bc20 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
1bc30 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
1bc40 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
1bc50 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
1bc60 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
1bc70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
1bc80 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
1bc90 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
1bca0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
1bcb0 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
1bcc0 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
1bcd0 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
1bce0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
1bcf0 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
1bd00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1bd10 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
1bd20 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
1bd30 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1bd40 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
1bd50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bd60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1bd70 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
1bd80 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
1bd90 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
1bda0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
1bdb0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
1bdc0 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
1bdd0 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
1bde0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
1bdf0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1be00 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
1be10 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1be20 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
1be30 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
1be40 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
1be50 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
1be60 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1be70 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
1be80 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
1be90 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
1bea0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
1beb0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1bec0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1bed0 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
1bee0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1bef0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1bf00 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
1bf10 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1bf20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1bf30 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1bf40 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1bf50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1bf60 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
1bf70 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
1bf80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1bf90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bfb0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1bfc0 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
1bfd0 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
1bfe0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1bff0 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
1c000 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1c010 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
1c020 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
1c030 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
1c040 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
1c050 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c060 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c070 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1c080 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
1c090 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
1c0a0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
1c0b0 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
1c0c0 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
1c0d0 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
1c0e0 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
1c0f0 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
1c100 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
1c110 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
1c120 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1c130 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
1c140 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1c150 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1c160 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
1c170 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
1c180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c1a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1c1b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c1c0 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
1c1d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1c1e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c1f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1c200 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1c210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c220 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1c230 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
1c240 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
1c250 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1c260 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
1c270 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1c280 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1c290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c2a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1c2b0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
1c2c0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
1c2d0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
1c2e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c2f0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1c300 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
1c310 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
1c320 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
1c330 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1c340 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
1c350 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
1c360 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
1c370 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
1c380 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
1c390 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1c3a0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
1c3b0 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ful, return.** S
1c3c0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
1c3d0 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
1c3e0 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
1c3f0 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a  re no point in .
1c400 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
1c410 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
1c420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1c430 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ONE. Or, if an e
1c440 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1c450 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68   return some oth
1c460 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  er error code..*
1c470 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
1c480 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  ically, this fun
1c490 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1c4a0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
1c4b0 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
1c4c0 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
1c4d0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
1c4e0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1c4f0 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
1c500 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
1c510 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
1c520 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1c530 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
1c540 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
1c550 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
1c560 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1c570 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1c580 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
1c590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
1c5a0 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
1c5b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
1c5c0 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
1c5d0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
1c5e0 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
1c5f0 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
1c600 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
1c610 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c620 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
1c630 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
1c640 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
1c650 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
1c660 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70  on-commit .** op
1c670 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
1c680 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
1c690 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
1c6a0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
1c6b0 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
1c6c0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
1c6d0 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
1c6e0 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
1c6f0 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
1c700 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1c710 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1c720 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
1c730 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
1c740 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
1c750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c760 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1c770 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
1c780 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
1c790 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
1c7a0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
1c7b0 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
1c7c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1c7d0 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
1c7e0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
1c7f0 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
1c800 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1c810 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1c820 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
1c830 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
1c840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c850 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1c860 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
1c870 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
1c880 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
1c890 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1c8a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c8b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c8c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
1c8d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1c8e0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
1c8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1c900 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1c910 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
1c920 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
1c930 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
1c940 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1c950 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1c960 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1c970 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
1c980 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
1c990 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
1c9a0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
1c9b0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
1c9c0 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
1c9d0 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
1c9e0 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
1c9f0 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
1ca00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1ca10 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
1ca20 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
1ca30 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
1ca40 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
1ca50 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
1ca60 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1ca70 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1ca80 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
1ca90 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1caa0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1cab0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1cac0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1cad0 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
1cae0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
1caf0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1cb00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cb10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cb20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cb30 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1cb40 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
1cb50 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1cb60 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1cb70 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
1cb80 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
1cb90 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
1cba0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
1cbb0 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
1cbc0 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
1cbd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
1cbe0 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
1cbf0 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
1cc00 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
1cc10 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1cc20 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1cc30 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
1cc40 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
1cc50 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
1cc60 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1cc70 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1cc80 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
1cc90 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1cca0 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
1ccb0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
1ccc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ccd0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1cce0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
1ccf0 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69      /* If bCommi
1cd00 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  t is zero, this 
1cd10 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
1cd20 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
1cd30 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
1cd40 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
1cd50 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
1cd60 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
1cd70 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
1cd80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1cd90 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
1cda0 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69  nd, if bCommit i
1cdb0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
1cdc0 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
1cdd0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
1cde0 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
1cdf0 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
1ce00 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
1ce10 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
1ce20 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
1ce30 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
1ce40 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1ce50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
1ce60 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45  ode = BTALLOC_LE
1ce70 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20  ;.        iNear 
1ce80 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
1ce90 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
1cea0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1ceb0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1cec0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1ced0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1cee0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65  g, &iFreePg, iNe
1cef0 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  ar, eMode);.    
1cf00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cf10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cf20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1cf30 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
1cf40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cf60 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1cf70 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
1cf80 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69  le( bCommit && i
1cf90 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
1cfa0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1cfb0 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
1cfc0 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
1cfd0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
1cfe0 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
1cff0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
1d000 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b  reePg, bCommit);
1d010 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1d020 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1d030 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d060 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d070 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1d080 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
1d090 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
1d0a0 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d  }while( iLastPg=
1d0b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d0c0 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41  GE(pBt) || PTRMA
1d0d0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1d0e0 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42  astPg) );.    pB
1d0f0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1d100 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61   1;.    pBt->nPa
1d110 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20  ge = iLastPg;.  
1d120 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d130 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1d140 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1d150 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
1d160 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
1d170 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1d180 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67  ase.** nOrig pag
1d190 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
1d1a0 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65  ining nFree free
1d1b0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74   pages. Return t
1d1c0 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
1d1d0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1d1e0 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f  base in pages fo
1d1f0 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d  llowing an auto-
1d200 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
1d210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
1d220 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53   finalDbSize(BtS
1d230 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1d240 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72   nOrig, Pgno nFr
1d250 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  ee){.  int nEntr
1d260 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1d270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d280 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
1d290 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
1d2a0 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70  /.  Pgno nPtrmap
1d2b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d2c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d2d0 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
1d2e0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50   be freed */.  P
1d2f0 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d310 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1d320 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  /..  nEntry = pB
1d330 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
1d340 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46  .  nPtrmap = (nF
1d350 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
1d360 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
1d370 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
1d380 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ry;.  nFin = nOr
1d390 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
1d3a0 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69  rmap;.  if( nOri
1d3b0 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
1d3c0 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
1d3d0 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
1d3e0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1d3f0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  Fin--;.  }.  whi
1d400 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1d410 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
1d420 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
1d430 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1d440 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1d450 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a  .  return nFin;.
1d460 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
1d470 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1d480 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
1d490 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1d4a0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
1d4b0 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
1d4c0 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
1d4d0 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
1d4e0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
1d4f0 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
1d500 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
1d510 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
1d520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
1d530 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
1d540 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
1d550 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
1d560 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
1d570 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
1d580 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1d590 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1d5a0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
1d5b0 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
1d5c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
1d5d0 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
1d5e0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1d5f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d600 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
1d610 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1d620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1d630 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1d640 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
1d650 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1d660 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
1d670 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
1d680 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1d690 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
1d6a0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e{.    Pgno nOri
1d6b0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1d6c0 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e  nt(pBt);.    Pgn
1d6d0 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79  o nFree = get4by
1d6e0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1d6f0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1d700 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e   Pgno nFin = fin
1d710 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1d720 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20  rig, nFree);..  
1d730 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e    if( nOrig<nFin
1d740 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1d750 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d760 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
1d770 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
1d780 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1d790 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1d7a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1d7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d7c0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
1d7d0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1d7e0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72  (pBt);.        r
1d7f0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1d800 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f  ep(pBt, nFin, nO
1d810 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  rig, 0);.      }
1d820 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d850 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1d860 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1d870 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1d880 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1d890 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1d8a0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
1d8b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d8c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1d8d0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NE;.    }.  }.  
1d8e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1d8f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1d900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d910 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d920 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
1d930 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
1d940 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
1d950 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65  n.** is committe
1d960 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
1d970 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
1d980 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1d990 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1d9a0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
1d9b0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1d9c0 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
1d9d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d9e0 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
1d9f0 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
1da00 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
1da10 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
1da20 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1da30 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
1da40 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
1da50 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
1da60 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
1da70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1da80 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1da90 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1daa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dab0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1dac0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1dad0 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
1dae0 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
1daf0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1db00 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
1db10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1db20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1db30 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
1db40 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1db50 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
1db60 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
1db70 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
1db80 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
1db90 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
1dba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1dbb0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
1dbc0 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
1dbd0 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
1dbe0 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
1dbf0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dc00 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1dc10 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
1dc20 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ly */.    Pgno i
1dc30 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1dc40 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
1dc50 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
1dc60 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
1dc70 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1dc80 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
1dc90 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
1dca0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1dcb0 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
1dcc0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1dcd0 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
1dce0 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
1dcf0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1dd00 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
1dd10 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
1dd20 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
1dd30 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
1dd40 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
1dd50 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
1dd60 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
1dd70 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
1dd80 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
1dd90 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
1dda0 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
1ddb0 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
1ddc0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1ddd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dde0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ddf0 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
1de00 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1de10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1de20 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  6]);.    nFin = 
1de30 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1de40 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1de50 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
1de60 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
1de70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1de80 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f  .    if( nFin<nO
1de90 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
1dea0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1deb0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1dec0 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65   }.    for(iFree
1ded0 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
1dee0 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
1def0 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
1df00 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1df10 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1df20 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20  in, iFree, 1);. 
1df30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
1df40 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
1df50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
1df60 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
1df70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1df80 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1df90 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1dfa0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1dfb0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1dfc0 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
1dfd0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1dfe0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1dff0 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
1e000 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e010 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1e020 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
1e030 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1e040 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = 1;.      pBt->
1e050 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
1e060 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1e070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e080 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1e090 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1e0a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1e0b0 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69  sert( nRef>=sqli
1e0c0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1e0d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
1e0e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1e0f0 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
1e100 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1e110 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
1e120 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
1e130 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
1e140 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
1e150 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1e160 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
1e170 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
1e180 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1e190 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
1e1a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
1e1b0 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
1e1c0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
1e1d0 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
1e1e0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
1e1f0 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
1e200 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
1e210 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
1e220 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
1e230 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
1e240 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
1e250 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
1e260 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
1e270 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
1e280 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1e290 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
1e2a0 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
1e2b0 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
1e2c0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
1e2d0 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
1e2e0 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
1e2f0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1e300 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1e310 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1e320 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
1e330 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
1e340 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
1e350 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
1e360 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
1e370 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
1e380 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
1e390 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
1e3a0 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
1e3b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1e3c0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
1e3d0 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
1e3e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1e3f0 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
1e400 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
1e410 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
1e420 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1e430 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
1e440 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
1e450 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
1e460 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
1e470 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
1e480 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
1e490 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1e4a0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
1e4b0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1e4c0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
1e4d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1e4e0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1e4f0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1e500 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
1e510 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
1e520 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
1e530 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
1e540 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1e550 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
1e560 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1e570 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
1e580 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
1e590 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1e5a0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1e5b0 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
1e5c0 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
1e5d0 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
1e5e0 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
1e5f0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
1e600 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
1e610 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
1e620 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
1e630 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
1e640 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
1e650 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1e660 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
1e670 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
1e680 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1e690 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1e6a0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1e6b0 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
1e6c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1e6d0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1e6e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1e6f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1e700 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1e710 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e720 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
1e730 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1e740 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e750 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e760 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1e770 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1e780 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
1e790 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
1e7a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e7b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e7c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1e7d0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
1e7e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e7f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1e800 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1e810 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e820 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1e830 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
1e840 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1e850 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
1e860 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e870 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1e880 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
1e890 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
1e8a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1e8b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e8c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e8d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e8e0 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
1e8f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1e900 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
1e910 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
1e920 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
1e930 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
1e940 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1e950 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1e960 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
1e970 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e980 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1e990 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
1e9a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e9b0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1e9c0 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  p) );..#ifndef S
1e9d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e9e0 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f  ACUUM.  pBt->bDo
1e9f0 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65  Truncate = 0;.#e
1ea00 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ndif.  if( p->in
1ea10 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1ea20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   && db->nVdbeRea
1ea30 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  d>1 ){.    /* If
1ea40 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1ea50 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
1ea60 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
1ea70 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
1ea80 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
1ea90 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
1eaa0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1eab0 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
1eac0 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
1ead0 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
1eae0 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1eaf0 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
1eb00 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
1eb10 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1eb20 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
1eb30 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
1eb40 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1eb50 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1eb60 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
1eb70 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
1eb80 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
1eb90 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
1eba0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
1ebb0 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
1ebc0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1ebd0 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
1ebe0 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
1ebf0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1ec00 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
1ec10 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
1ec20 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
1ec30 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
1ec40 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
1ec50 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
1ec60 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
1ec70 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1ec80 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
1ec90 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1eca0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
1ecb0 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
1ecc0 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
1ecd0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1ece0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
1ecf0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1ed00 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
1ed10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1ed20 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
1ed30 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
1ed40 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
1ed50 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
1ed60 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
1ed70 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
1ed80 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
1ed90 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1eda0 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
1edb0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
1edc0 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
1edd0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1ede0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1edf0 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
1ee00 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
1ee10 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
1ee20 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
1ee30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1ee40 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
1ee50 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1ee60 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
1ee70 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
1ee80 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1ee90 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
1eea0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1eeb0 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
1eec0 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
1eed0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
1eee0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1eef0 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
1ef00 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1ef10 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
1ef20 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
1ef30 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
1ef40 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
1ef50 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
1ef60 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
1ef70 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
1ef80 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
1ef90 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
1efa0 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
1efb0 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
1efc0 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
1efd0 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
1efe0 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
1eff0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1f000 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
1f010 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
1f020 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
1f030 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
1f040 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1f050 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
1f060 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70  curs while the p
1f070 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74  ager layer is at
1f080 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20  tempting to .** 
1f090 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  finalize the und
1f0a0 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  erlying journal 
1f0b0 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  file, this funct
1f0c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
1f0d0 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rror and.** the 
1f0e0 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
1f0f0 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
1f100 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ack. However, if
1f110 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1f120 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  ment.** is non-z
1f130 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d  ero then this b-
1f140 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
1f150 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75   is part of a mu
1f160 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61  lti-file .** tra
1f170 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
1f180 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e  s case, the tran
1f190 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
1f1a0 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  ady been committ
1f1b0 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74  ed .** (by delet
1f1c0 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
1f1d0 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
1f1e0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69  he caller will i
1f1f0 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  gnore this .** f
1f200 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
1f210 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69  code. So, even i
1f220 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1f230 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c  s in the pager l
1f240 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74  ayer,.** reset t
1f250 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
1f260 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  s internal state
1f270 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1f280 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74  t the write.** t
1f290 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
1f2a0 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  een closed. This
1f2b0 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20   is quite safe, 
1f2c0 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  as the pager wil
1f2d0 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69  l have.** transi
1f2e0 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72  tioned to the er
1f2f0 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
1f300 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1f310 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1f320 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1f330 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1f340 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1f350 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1f360 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1f370 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1f380 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1f390 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
1f3a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65  ree *p, int bCle
1f3b0 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  anup){..  if( p-
1f3c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1f3d0 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  NONE ) return SQ
1f3e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1f3f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f400 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1f410 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1f420 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
1f430 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1f440 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
1f450 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
1f460 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
1f470 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
1f480 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1f490 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
1f4a0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1f4b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1f4c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1f4d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1f4e0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1f4f0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1f500 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1f510 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
1f520 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
1f530 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
1f540 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f550 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1f560 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1f570 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f580 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d  OK && bCleanup==
1f590 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1f5a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f5b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f5c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
1f5d0 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20  DataVersion--;  
1f5e0 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f  /* Compensate fo
1f5f0 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56  r pPager->iDataV
1f600 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20  ersion++; */.   
1f610 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1f620 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1f630 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1f640 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1f650 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1f660 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1f670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f680 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f6a0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
1f6b0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
1f6c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f6d0 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
1f6e0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1f6f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1f700 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
1f710 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1f720 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
1f730 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1f750 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f760 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30  mitPhaseTwo(p, 0
1f770 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1f780 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1f790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f7a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f7b0 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1f7c0 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1f7d0 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1f7e0 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1f7f0 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1f800 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72  or on any BtShar
1f810 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1f820 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f  * references.  O
1f830 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e  r if the writeOn
1f840 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ly flag is set t
1f850 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a  o 1, then only.*
1f860 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72  * trip write cur
1f870 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72  sors and leave r
1f880 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68  ead cursors unch
1f890 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  anged..**.** Eve
1f8a0 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63  ry cursor is a c
1f8b0 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
1f8c0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
1f8d0 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61  g cursors.** tha
1f8e0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65  t belong to othe
1f8f0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1f900 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
1f910 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72  en to be.** shar
1f920 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69  ing the cache wi
1f930 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
1f940 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
1f950 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
1f960 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1f970 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  . If the writeOn
1f980 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  ly.** flag is tr
1f990 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ue, then only wr
1f9a0 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64  ite-cursors need
1f9b0 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65   be tripped - re
1f9c0 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f  ad-only.** curso
1f9d0 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75  rs save their cu
1f9e0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20  rrent positions 
1f9f0 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79  so that they may
1fa00 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f   continue .** fo
1fa10 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c  llowing the roll
1fa20 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69  back. Or, if wri
1fa30 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c  teOnly is false,
1fa40 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
1fa50 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e   .** tripped. In
1fa60 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f   general, writeO
1fa70 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20  nly is false if 
1fa80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1fa90 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20  being.** rolled 
1faa0 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68  back modified th
1fab0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1fac0 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
1fad0 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70  b-tree root.** p
1fae0 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65  ages may be move
1faf0 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f  d or deleted fro
1fb00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  m the database a
1fb10 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e  ltogether, makin
1fb20 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66  g.** it unsafe f
1fb30 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
1fb40 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
1fb50 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  ** If the writeO
1fb60 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  nly flag is true
1fb70 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73   and an error is
1fb80 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
1fb90 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68  le .** saving th
1fba0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
1fbb0 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c  on of a read-onl
1fbc0 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75  y cursor, all cu
1fbd0 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75  rsors, .** inclu
1fbe0 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75  ding all read-cu
1fbf0 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65  rsors are trippe
1fc00 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1fc10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1fc20 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1fc30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1fc40 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76  urs while.** sav
1fc50 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73  ing a cursor pos
1fc60 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65  ition, an SQLite
1fc70 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1fc80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1fc90 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1fca0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1fcb0 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77  t errCode, int w
1fcc0 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  riteOnly){.  BtC
1fcd0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20  ursor *p;.  int 
1fce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fcf0 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74  .  assert( (writ
1fd00 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74  eOnly==0 || writ
1fd10 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43  eOnly==1) && BTC
1fd20 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29  F_WriteFlag==1 )
1fd30 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1fd40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1fd50 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1fd60 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65  .    for(p=pBtre
1fd70 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1fd80 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1fd90 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1fda0 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
1fdb0 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
1fdc0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1fdd0 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
1fde0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
1fdf0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
1fe00 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
1fe10 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
1fe20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
1fe30 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1fe40 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
1fe50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fe60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fe70 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
1fe80 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1fe90 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
1fea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1feb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1fec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1fee0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1fef0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
1ff00 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1ff10 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1ff20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
1ff30 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1ff40 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1ff50 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1ff60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65  i++){.        re
1ff70 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1ff80 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  age[i]);.       
1ff90 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1ffa0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1ffb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ffc0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1ffd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ffe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1fff0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
20000 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
20010 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
20020 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
20030 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
20040 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
20050 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
20060 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
20070 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
20080 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
20090 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
200a0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
200b0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
200c0 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
200d0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
200e0 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
200f0 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
20100 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
20110 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
20120 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
20130 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20140 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
20150 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
20160 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
20170 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
20180 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
20190 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
201a0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
201b0 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
201c0 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
201d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
201e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
201f0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
20200 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
20210 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
20220 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
20230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
20240 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
20250 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
20260 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20270 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
20280 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
20290 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
202a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
202b0 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
202c0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
202d0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
202e0 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
202f0 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
20300 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
20310 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
20320 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
20330 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
20340 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
20350 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
20360 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
20370 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
20380 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
20390 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
203a0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
203b0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
203c0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
203d0 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
203e0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
203f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
20400 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
20410 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
20420 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
20430 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
20440 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
20450 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
20460 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
20470 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
20480 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
20490 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
204a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
204b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
204c0 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
204d0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
204e0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
204f0 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
20500 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
20510 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
20520 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
20530 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
20540 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
20550 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
20560 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
20570 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
20580 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
20590 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
205a0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
205b0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
205c0 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
205d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
205e0 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
205f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
20600 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
20610 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
20620 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
20630 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
20640 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
20650 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
20660 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
20670 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20680 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
20690 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
206a0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
206b0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
206c0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
206d0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
206e0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
206f0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
20700 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20710 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20730 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
20740 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
20750 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
20760 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
20770 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
20780 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
20790 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
207a0 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
207b0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
207c0 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
207d0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
207e0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
207f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
20800 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
20810 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
20820 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
20830 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
20840 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
20850 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
20860 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
20870 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
20880 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
20890 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
208a0 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
208b0 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
208c0 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
208d0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
208e0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
208f0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
20900 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
20910 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
20920 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
20930 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
20940 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
20950 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
20960 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
20970 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
20980 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
20990 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
209a0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
209b0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
209c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
209d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
209e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
209f0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
20a00 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
20a10 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
20a20 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
20a30 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
20a40 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
20a50 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
20a60 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
20a70 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
20a80 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
20a90 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
20aa0 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
20ab0 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
20ac0 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
20ad0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
20ae0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
20af0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
20b00 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
20b10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
20b20 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
20b30 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
20b40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
20b50 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20b60 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
20b70 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20b80 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
20b90 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
20bb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
20bc0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
20bd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
20be0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
20bf0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
20c00 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
20c10 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
20c20 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
20c30 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
20c40 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
20c50 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
20c60 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
20c70 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
20c80 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
20c90 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
20ca0 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
20cb0 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
20cc0 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
20cd0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
20ce0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
20cf0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
20d00 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
20d10 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
20d20 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
20d30 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
20d40 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20d50 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
20d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20d70 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
20d80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
20d90 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
20da0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
20dd0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
20de0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
20df0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
20e00 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
20e10 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
20e20 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
20e30 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
20e40 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
20e50 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
20e60 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
20e70 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
20e80 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
20e90 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
20ea0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
20eb0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
20ec0 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
20ed0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
20ee0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
20ef0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
20f00 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
20f10 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
20f20 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
20f30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
20f40 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
20f50 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
20f60 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
20f70 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
20f80 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
20f90 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
20fa0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
20fb0 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
20fc0 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
20fd0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
20fe0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
20ff0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21000 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
21010 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
21020 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
21030 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21040 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
21050 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
21060 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
21070 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21080 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
21090 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
210a0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
210b0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
210c0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
210d0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
210e0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
210f0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
21100 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
21110 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
21120 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21140 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
21150 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
21160 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
21170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21180 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
21190 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
211a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
211b0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
211c0 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
211d0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
211e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
211f0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
21200 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
21210 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
21220 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
21230 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
21240 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
21250 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
21260 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
21270 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
21280 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
21290 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
212a0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
212b0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
212c0 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
212d0 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
212e0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
212f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
21300 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
21310 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21320 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
21330 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21340 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
21350 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
21360 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
21370 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
21380 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
21390 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
213a0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
213b0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
213c0 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
213d0 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
213e0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
213f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
21400 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
21410 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
21420 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
21430 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
21440 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
21450 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
21460 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
21470 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
21480 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
21490 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
214a0 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
214b0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
214c0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
214d0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
214e0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
214f0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
21500 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
21510 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
21520 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
21530 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
21540 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
21550 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
21560 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
21570 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
21580 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
21590 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
215a0 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
215b0 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
215c0 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
215d0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
215e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
215f0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
21600 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
21610 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
21620 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
21630 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
21640 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
21650 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
21660 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
21670 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
21680 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
21690 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
216a0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
216b0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
216c0 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
216d0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
216e0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
216f0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
21700 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
21710 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
21720 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
21730 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
21740 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
21750 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
21760 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
21770 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
21780 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
21790 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
217a0 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
217b0 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
217c0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
217d0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
217e0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
217f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
21800 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
21810 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
21820 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
21830 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
21840 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
21850 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
21860 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
21870 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
21880 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
21890 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
218a0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
218b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
218c0 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
218d0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
21900 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
21910 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21930 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
21940 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
21950 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
21980 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
21990 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
219a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
219b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
219c0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
219d0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
219e0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
219f0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
21a20 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
21a30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21a40 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
21a50 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
21a60 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
21a70 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58  /.  BtCursor *pX
21a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21aa0 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72  oping over other
21ab0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a   all cursors */.
21ac0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21ad0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
21ae0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
21af0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
21b00 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rFlag==1 );..  /
21b10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
21b20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
21b30 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
21b40 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
21b50 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
21b60 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
21b70 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
21b80 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
21b90 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
21ba0 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
21bb0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
21bc0 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
21bd0 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
21be0 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
21bf0 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
21c00 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
21c10 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
21c20 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
21c30 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b  Info!=0, wrFlag+
21c40 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
21c50 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
21c60 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
21c70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
21c80 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
21c90 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
21ca0 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
21cb0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
21cc0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
21cd0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
21ce0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
21cf0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
21d00 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21d10 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
21d20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
21d30 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21d40 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
21d50 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
21d60 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
21d70 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
21d80 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
21d90 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
21da0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
21db0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
21dc0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
21dd0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
21de0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
21df0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
21e00 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
21e10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
21e20 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
21e30 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
21e40 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
21e50 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
21e60 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
21e70 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
21e80 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
21e90 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
21ea0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
21eb0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
21ec0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
21ed0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
21ee0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
21ef0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
21f00 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
21f10 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
21f20 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
21f30 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
21f40 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
21f50 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42  ==0 || wrFlag==B
21f60 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b  TCF_WriteFlag );
21f70 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
21f80 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  s = wrFlag;.  pC
21f90 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
21fa0 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a  s = wrFlag ? 0 :
21fb0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
21fc0 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65  NLY;.  /* If the
21fd0 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f  re are two or mo
21fe0 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  re cursors on th
21ff0 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68  e same btree, th
22000 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a  en all such.  **
22010 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20   cursors *must* 
22020 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75  have the BTCF_Mu
22030 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
22040 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74   */.  for(pX=pBt
22050 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70  ->pCursor; pX; p
22060 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
22070 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f    if( pX->pgnoRo
22080 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65  ot==(Pgno)iTable
22090 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75   ){.      pX->cu
220a0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
220b0 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70  ultiple;.      p
220c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
220d0 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
220e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
220f0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
22100 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70  Cursor;.  pBt->p
22110 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
22120 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
22130 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
22140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22150 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
22160 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
22170 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
221a0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
221b0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
221e0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
221f0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
22200 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
22230 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
22240 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
22250 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
22260 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
22270 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
22280 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
22290 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
222a0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
222d0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
222e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
222f0 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20  iTable<1 ){.    
22300 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
22310 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  UPT_BKPT;.  }els
22320 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  e{.    sqlite3Bt
22330 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
22340 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
22350 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
22360 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
22370 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cur);.    sqlite
22380 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
22390 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
223a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
223b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
223c0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
223d0 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
223e0 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
223f0 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
22400 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
22410 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
22420 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
22430 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
22440 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
22450 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
22460 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
22470 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
22480 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
22490 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
224a0 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
224b0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
224c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
224d0 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
224e0 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  oid){.  return R
224f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43  OUND8(sizeof(BtC
22500 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ursor));.}../*.*
22510 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
22520 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
22530 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
22540 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
22550 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d  t..**.** The sim
22560 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72  ple approach her
22570 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65  e would be to me
22580 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72  mset() the entir
22590 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a  e object.** to z
225a0 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72  ero.  But it tur
225b0 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  ns out that the 
225c0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
225d0 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64  dx[] arrays.** d
225e0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  o not need to be
225f0 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79   zeroed and they
22600 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77   are large, so w
22610 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74  e can save a lot
22620 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20  .** of run-time 
22630 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  by skipping the 
22640 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
22650 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73  f those elements
22660 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22670 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
22680 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
22690 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66   memset(p, 0, of
226a0 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c  fsetof(BtCursor,
226b0 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a   iPage));.}../*.
226c0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
226d0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
226e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
226f0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
22700 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
22710 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
22720 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
22730 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
22740 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
22750 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
22760 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
22770 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
22780 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
22790 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
227a0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
227b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
227c0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
227d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
227e0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
227f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
22800 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  t->pCursor!=0 );
22810 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43  .    if( pBt->pC
22820 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20  ursor==pCur ){. 
22830 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
22840 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
22850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22860 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65    BtCursor *pPre
22870 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  v = pBt->pCursor
22880 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
22890 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70      if( pPrev->p
228a0 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20  Next==pCur ){.  
228b0 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70          pPrev->p
228c0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
228d0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  xt;.          br
228e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
228f0 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70         pPrev = p
22900 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Prev->pNext;.   
22910 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59     }while( ALWAY
22920 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20  S(pPrev) );.    
22930 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
22940 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
22950 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
22960 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
22970 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
22980 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
22990 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
229a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
229b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
229c0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
229d0 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
229e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
229f0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
22a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22a10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
22a20 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
22a30 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
22a40 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
22a50 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
22a60 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
22a70 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
22a80 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
22a90 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
22aa0 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
22ab0 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
22ac0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
22ad0 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
22ae0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
22af0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
22b00 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
22b10 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
22b20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
22b30 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
22b40 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
22b50 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
22b60 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
22b70 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
22b80 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
22b90 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
22ba0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
22bb0 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
22bc0 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
22bd0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
22be0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
22bf0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
22c00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
22c10 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
22c20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
22c30 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69  _DB || memcmp(&i
22c40 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
22c50 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
22c60 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
22c70 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
22c80 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
22c90 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  if.static SQLITE
22ca0 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67  _NOINLINE void g
22cb0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
22cc0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
22cd0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
22ce0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ze==0 ){.    int
22cf0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
22d00 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Page;.    pCur->
22d10 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
22d20 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
22d30 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
22d40 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
22d50 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
22d60 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
22d70 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
22d80 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
22d90 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
22da0 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
22db0 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
22dc0 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
22dd0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
22de0 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
22df0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
22e00 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
22e10 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
22e20 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
22e30 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
22e40 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
22e50 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
22e60 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
22e70 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
22e80 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
22e90 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
22ea0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
22eb0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
22ec0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22ed0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
22ee0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
22ef0 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
22f00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22f10 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
22f20 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
22f30 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
22f40 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
22f50 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
22f60 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
22f70 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
22f80 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
22f90 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
22fa0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
22fb0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
22fc0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
22fd0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
22fe0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
22ff0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
23000 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
23010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
23020 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
23030 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
23040 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
23050 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a   in the key..**.
23060 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
23070 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  st position the 
23080 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20  cursor prior to 
23090 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
230a0 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  utine..** .** Th
230b0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
230c0 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61  t fail.  It alwa
230d0 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
230e0 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  E_OK.  .*/.int s
230f0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
23100 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
23110 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
23120 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23130 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23150 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23160 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
23170 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23180 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
23190 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72  ->info.nKey;.  r
231a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
231b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
231c0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
231d0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
231e0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
231f0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
23200 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
23210 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
23220 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
23230 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
23240 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
23250 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
23260 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
23270 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
23280 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
23290 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
232a0 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
232b0 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
232c0 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
232d0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
232e0 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
232f0 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
23300 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
23310 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
23320 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
23330 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
23340 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
23350 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
23360 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
23370 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
23380 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
23390 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
233a0 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
233b0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
233c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
233d0 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
233e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
233f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23410 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23420 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
23430 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
23440 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23450 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
23460 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
23470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23480 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23490 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61  Page]->intKeyLea
234a0 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c  f==1 );.  getCel
234b0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
234c0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
234d0 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72  fo.nPayload;.  r
234e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
234f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
23500 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
23510 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
23520 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
23530 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
23540 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
23550 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
23560 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
23570 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
23580 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
23590 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
235a0 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
235b0 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
235c0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
235d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
235e0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
235f0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
23600 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
23610 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
23620 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23630 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
23640 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
23650 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
23660 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
23670 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
23680 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
23690 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
236a0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
236b0 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
236c0 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
236d0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
236e0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
236f0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
23700 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
23710 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
23720 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
23730 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
23740 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
23750 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
23760 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
23770 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
23780 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
23790 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
237a0 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
237b0 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
237c0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
237d0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
237e0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
237f0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
23800 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
23810 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
23820 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
23830 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
23840 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
23850 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
23860 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
23870 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
23880 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
23890 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
238a0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
238b0 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
238c0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
238d0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
238e0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
238f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
23900 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
23910 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23920 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
23930 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
23940 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
23950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23960 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
23970 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
23980 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
23990 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
239a0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
239b0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
239c0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
239d0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
239e0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
239f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23a00 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
23a10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23a20 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
23a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
23a40 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
23a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23a60 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
23a70 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
23a80 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
23a90 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
23aa0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
23ab0 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
23ac0 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
23ad0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
23ae0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
23af0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
23b00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
23b10 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
23b20 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
23b30 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
23b40 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
23b50 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
23b60 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
23b70 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
23b80 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
23b90 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
23ba0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
23bb0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
23bc0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
23bd0 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
23be0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
23bf0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
23c00 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
23c10 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
23c20 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
23c30 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
23c40 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
23c50 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
23c60 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
23c70 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
23c80 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
23c90 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
23ca0 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
23cb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23cc0 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
23cd0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
23ce0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
23cf0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
23d00 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
23d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
23d20 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
23d30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
23d40 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
23d50 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
23d60 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
23d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23d80 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
23d90 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
23da0 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
23db0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
23dc0 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
23dd0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
23de0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
23df0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
23e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23e10 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
23e20 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
23e30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
23e40 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
23e50 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
23e60 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
23e70 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
23e80 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
23e90 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
23ea0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
23eb0 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
23ec0 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
23ed0 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
23ee0 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
23ef0 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
23f00 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
23f10 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
23f20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
23f30 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
23f40 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
23f50 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
23f60 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
23f70 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
23f80 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
23f90 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
23fa0 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
23fb0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
23fc0 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
23fd0 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
23fe0 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
23ff0 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
24000 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
24010 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
24020 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
24030 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
24040 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
24050 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
24060 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
24070 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
24080 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
24090 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
240a0 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
240b0 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
240c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
240d0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
240e0 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
240f0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
24100 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
24110 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
24120 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
24130 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24140 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
24150 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
24180 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
24190 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
241a0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
241b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
241c0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
241d0 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
241e0 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
241f0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
24200 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
24210 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
24220 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
24230 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24240 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
24250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
24270 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24280 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
24290 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
242a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
242b0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
242c0 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
242d0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
242e0 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
242f0 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
24300 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
24310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24320 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24330 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
24340 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
24350 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
24360 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
24370 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
24380 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
24390 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
243a0 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
243b0 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
243c0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
243d0 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
243e0 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
243f0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24400 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24410 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
24420 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
24430 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
24440 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
24450 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69    2: The operati
24460 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f  on is a read. Do
24470 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
24480 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24490 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
244a0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
244b0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
244c0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
244d0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
244e0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
244f0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
24500 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
24510 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
24520 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
24530 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
24540 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
24550 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
24560 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
24570 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
24580 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
24590 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
245a0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
245b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
245c0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20   and the.** eOp 
245d0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
245e0 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  2, this function
245f0 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
24600 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
24610 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73  ly .** populates
24620 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
24630 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
24640 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
24650 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
24660 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
24670 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
24680 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
24690 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
246a0 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
246b0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
246c0 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
246d0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
246e0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
246f0 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
24700 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
24710 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
24720 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
24730 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
24740 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
24750 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
24760 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
24770 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
24780 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
24790 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
247a0 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
247b0 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
247c0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
247d0 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
247e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
247f0 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
24800 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
24810 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
24820 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
24830 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
24840 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
24850 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
24860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
24870 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
24880 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
24890 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
248a0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
248b0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
248c0 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
248d0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
248e0 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
248f0 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
24900 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
24910 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
24920 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
24930 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
24940 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
24950 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
24960 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
24970 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
24980 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
24990 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
249a0 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
249b0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
249c0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
249d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
249e0 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  OK;.  int iIdx =
249f0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
24a00 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24a10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24a20 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
24a30 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
24a40 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
24a50 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
24a80 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
24a90 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
24aa0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
24ab0 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e  OW_READ.  unsign
24ac0 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
24ad0 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66  pBufStart = pBuf
24ae0 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20  ;.  int bEnd;   
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b10 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
24b20 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20   to end of data 
24b30 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
24b40 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
24b50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24b60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24b70 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
24b80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24b90 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
24ba0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
24bb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24bc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24bd0 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c  ssert( eOp!=2 ||
24be0 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20   offset==0 );   
24bf0 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74   /* Always start
24c00 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
24c10 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20  for eOp==2 */.. 
24c20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
24c30 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
24c40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
24c50 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c  load;.#ifdef SQL
24c60 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
24c70 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
24c80 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43  = offset+amt==pC
24c90 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
24ca0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  d;.#endif.  asse
24cb0 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
24cc0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
24cd0 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20  yload );..  if( 
24ce0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
24cf0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
24d00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
24d10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
24d20 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
24d30 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
24d40 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
24d50 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
24d60 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
24d70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24d80 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
24d90 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
24da0 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
24db0 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
24dc0 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
24dd0 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
24de0 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
24df0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
24e00 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
24e10 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
24e20 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
24e30 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
24e40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
24e50 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
24e60 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
24e70 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
24e80 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  t], pBuf, a, (eO
24e90 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65  p & 0x01), pPage
24ea0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
24eb0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
24ec0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
24ed0 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
24ee0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
24ef0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
24f00 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  l;.  }...  if( r
24f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24f20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
24f30 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
24f40 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
24f50 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
24f60 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
24f70 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
24f80 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
24f90 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
24fa0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
24fb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
24fc0 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
24fd0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
24fe0 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
24ff0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
25000 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
25010 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
25020 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   do not allocate
25030 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72   aOverflow[] for
25040 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a   eOp==2..    **.
25050 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
25060 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
25070 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
25080 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
25090 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
250a0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
250b0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
250c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
250d0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
250e0 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
250f0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
25100 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
25110 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
25120 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
25130 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
25140 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
25150 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
25160 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
25170 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
25180 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75  !=2 && (pCur->cu
25190 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
251a0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
251b0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
251c0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
251d0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
251e0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
251f0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
25200 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
25210 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
25220 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
25230 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
25240 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
25250 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
25260 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
25270 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
25280 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
25290 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
252a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
252b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
252c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
252d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
252e0 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
252f0 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
25300 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
25310 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
25320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25340 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
25350 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
25360 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
25370 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
25380 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
25390 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
253a0 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vfl;.      }.   
253b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
253c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
253d0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
253e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
253f0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
25400 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
25410 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
25420 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
25430 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
25440 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
25450 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
25460 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
25470 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d  TCF_ValidOvfl)!=
25480 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  0.     && pCur->
25490 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
254a0 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29  /ovflSize].    )
254b0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
254c0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
254d0 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
254e0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
254f0 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
25500 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
25510 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
25520 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  }..    for( ; rc
25530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
25540 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
25550 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20  ; iIdx++){..    
25560 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
25570 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
25580 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25590 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
255a0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
255b0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
255c0 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20  idOvfl)!=0 ){.  
255d0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
255e0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
255f0 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
25600 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
25610 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
25620 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
25630 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
25640 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
25650 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
25660 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
25670 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
25680 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
25690 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
256a0 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
256b0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
256c0 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
256d0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
256e0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
256f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
25700 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
25710 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
25720 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
25730 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
25740 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25750 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
25760 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
25770 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
25780 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
25790 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
257a0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
257b0 65 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72  e that the aOver
257c0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73  flow[] array mus
257d0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62  t be allocated b
257e0 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20  ecause eOp!=2.  
257f0 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20        ** here.  
25800 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20  If eOp==2, then 
25810 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68  offset==0 and th
25820 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76  is branch is nev
25830 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20  er taken..      
25840 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
25850 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20  ert( eOp!=2 );. 
25860 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
25870 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25880 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29  BTCF_ValidOvfl )
25890 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
258a0 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  ( pCur->pBtree->
258b0 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20  db==pBt->db );. 
258c0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
258d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
258e0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
258f0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
25900 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
25910 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1];.        }els
25920 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
25930 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
25940 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
25950 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
25960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25970 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
25980 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
25990 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
259a0 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
259b0 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
259c0 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
259d0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
259e0 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
259f0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
25a00 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
25a10 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
25a20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
25a30 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
25a40 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
25a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25a60 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a  ile *fd;.#endif.
25a70 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
25a80 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
25a90 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
25aa0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
25ab0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
25ac0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
25ad0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
25ae0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
25af0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
25b00 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
25b10 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
25b20 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
25b30 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
25b40 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
25b50 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
25b60 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
25b70 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
25b80 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
25b90 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
25ba0 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
25bb0 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61  **   3) the data
25bc0 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
25bd0 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
25be0 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69   **   4) there i
25bf0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
25c00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
25c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
25c20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
25c30 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62   not a WAL datab
25c40 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase,.        ** 
25c50 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72    6) all data fr
25c60 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62  om the page is b
25c70 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20  eing read..     
25c80 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65     **   7) at le
25c90 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65  ast 4 bytes have
25ca0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
25cb0 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ad into the outp
25cc0 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20  ut buffer .     
25cd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
25ce0 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
25cf0 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
25d00 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
25d10 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
25d20 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
25d30 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
25d40 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
25d50 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
25d60 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
25d70 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
25d80 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
25d90 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
25da0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
25db0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25dc0 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d   if( (eOp&0x01)=
25dd0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25df0 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
25e00 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
25e10 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e40 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
25e50 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20      && (bEnd || 
25e60 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20  a==ovflSize)    
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
25e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
25ea0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25eb0 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20  on==TRANS_READ  
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
25ee0 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73        && (fd = s
25ef0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
25f00 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70  pBt->pPager))->p
25f10 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28  Methods     /* (
25f20 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
25f30 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
25f40 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20  Data[19]==0x01  
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20       /* (5) */. 
25f70 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
25f80 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fb0 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (7) */.        
25fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
25fd0 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20  aSave[4];.      
25fe0 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d      u8 *aWrite =
25ff0 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20   &pBuf[-4];.    
26000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57        assert( aW
26010 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20  rite>=pBufStart 
26020 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
26030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65             /* he
26040 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20  nce (7) */.     
26050 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
26060 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
26070 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26080 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
26090 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
260a0 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
260b0 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
260c0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
260d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
260e0 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
260f0 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
26100 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
26110 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
26120 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
26130 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
26140 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
26150 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26160 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
26170 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
26180 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
26190 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30         ((eOp&0x0
261a0 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  1)==0 ? PAGER_GE
261b0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
261c0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
261d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
261e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
261f0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
26200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
26210 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
26220 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
26230 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
26240 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
26250 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
26260 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
26270 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
26280 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31  uf, a, (eOp&0x01
26290 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ), pDbPage);.   
262a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
262b0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
262c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
262d0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
262e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
262f0 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
26300 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
26310 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
26320 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
26330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26340 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
26350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26360 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
26370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26380 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
26390 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
263a0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
263b0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
263c0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
263d0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
263e0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
263f0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
26400 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
26410 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
26420 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
26430 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
26440 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
26450 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
26460 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
26470 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26480 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
26490 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
264a0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
264b0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
264c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
264d0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
264e0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
264f0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
26500 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
26510 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
26520 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
26530 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
26540 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
26550 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26560 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26580 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26590 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
265a0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
265b0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
265c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
265d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
265e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
265f0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
26600 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26610 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
26620 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
26630 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
26640 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
26650 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
26660 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
26670 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
26680 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
26690 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
266a0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
266b0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
266c0 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
266d0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
266e0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
266f0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
26700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
26710 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
26720 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
26730 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
26740 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
26750 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
26760 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
26770 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
26780 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
26790 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
267a0 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
267b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
267c0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
267d0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
267e0 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
267f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
26800 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
26810 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26820 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
26830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
26840 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
26850 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
26860 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26870 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
26880 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
26890 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
268a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
268b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
268c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
268d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
268e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
268f0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
26900 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26910 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
26920 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
26930 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
26940 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26950 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
26960 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
26970 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
26980 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
26990 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
269a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
269b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
269c0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
269d0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
269e0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
269f0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
26a00 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
26a10 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
26a20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
26a30 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
26a40 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
26a50 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
26a60 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
26a70 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
26a80 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
26a90 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
26aa0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
26ab0 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
26ac0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
26ad0 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
26ae0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
26af0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
26b00 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
26b10 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
26b20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26b30 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
26b40 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
26b50 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
26b60 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
26b70 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
26b80 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
26b90 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
26ba0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
26bb0 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
26bc0 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
26bd0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
26be0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
26bf0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
26c00 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
26c10 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
26c20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
26c30 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
26c40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
26c50 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
26c60 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
26c70 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
26c80 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
26c90 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
26ca0 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
26cb0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
26cc0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
26cd0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
26ce0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
26cf0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
26d00 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
26d10 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
26d20 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
26d30 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
26d40 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
26d50 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
26d60 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
26d70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
26d80 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
26d90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
26da0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
26db0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
26dc0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
26dd0 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
26de0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
26df0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
26e00 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
26e10 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
26e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26e30 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
26e40 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
26e50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26e60 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
26e70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26e80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26e90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
26ea0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
26eb0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
26ec0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
26ed0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26ee0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
26ef0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
26f00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
26f10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26f20 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
26f30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26f40 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b  >info.nSize>0 );
26f50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26f60 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70  >info.pPayload>p
26f70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26f80 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20  ->iPage]->aData 
26f90 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
26fa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26fb0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
26fc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26fd0 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45  ->iPage]->aDataE
26fe0 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29  nd ||CORRUPT_DB)
26ff0 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28  ;.  amt = (int)(
27000 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27010 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
27020 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  End - pCur->info
27030 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66  .pPayload);.  if
27040 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  ( pCur->info.nLo
27050 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20  cal<amt ) amt = 
27060 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27070 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74  l;.  *pAmt = amt
27080 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
27090 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
270a0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
270b0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
270c0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
270d0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
270e0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
270f0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
27100 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
27110 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
27120 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
27130 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
27140 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
27150 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
27160 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
27170 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
27180 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
27190 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
271a0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
271b0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
271c0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
271d0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
271e0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
271f0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
27200 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
27210 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
27220 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
27230 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
27240 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
27250 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
27260 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
27270 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
27280 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
27290 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
272a0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
272b0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
272c0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
272d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
272e0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
272f0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
27300 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
27310 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
27320 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
27330 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
27340 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
27350 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
27360 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
27370 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
27380 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
27390 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
273a0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
273b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
273c0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
273d0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
273e0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
273f0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
27400 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
27410 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
27420 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
27430 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27440 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
27450 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
27460 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
27470 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
27480 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
27490 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
274a0 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
274b0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
274c0 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
274d0 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
274e0 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
274f0 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
27500 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
27510 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
27520 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
27530 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
27540 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
27550 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  o){.  BtShared *
27560 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
27570 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
27580 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27590 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
275a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
275b0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
275c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
275d0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
275e0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
275f0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
27600 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
27610 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
27620 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
27630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27640 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27650 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  T;.  }.  pCur->i
27660 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
27670 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
27680 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
27690 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
276a0 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  fl);.  pCur->iPa
276b0 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69  ge++;.  pCur->ai
276c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
276d0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67   = 0;.  return g
276e0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
276f0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75  t, newPgno, &pCu
27700 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27710 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27730 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50  pCur, pCur->curP
27740 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23  agerFlags);.}..#
27750 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
27760 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
27770 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
27780 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
27790 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
277a0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
277b0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
277c0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
277d0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
277e0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
277f0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
27800 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
27810 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
27820 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
27830 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
27840 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
27850 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
27860 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
27870 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
27880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
27890 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
278a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
278b0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
278c0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
278d0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
278e0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
278f0 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
27900 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
27910 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
27920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27930 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
27940 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
27950 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
27960 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
27970 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
27980 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
27990 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
279a0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
279b0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
279c0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
279d0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
279e0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
279f0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
27a00 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
27a10 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
27a20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
27a30 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
27a40 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
27a50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
27a60 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
27a70 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
27a80 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
27a90 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
27aa0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
27ab0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
27ac0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
27ad0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
27ae0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
27af0 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
27b00 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
27b10 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
27b20 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
27b30 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
27b40 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
27b50 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
27b60 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
27b70 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
27b80 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
27b90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27ba0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27bb0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27bc0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27be0 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
27bf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
27c00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27c10 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
27c20 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
27c30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27c40 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
27c50 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27c60 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
27c70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27c80 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
27c90 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
27ca0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27cb0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
27cc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27cd0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
27ce0 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
27cf0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
27d00 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
27d10 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
27d20 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
27d30 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
27d40 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
27d50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27d60 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  --]);.}../*.** M
27d70 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
27d80 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
27d90 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
27da0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
27db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
27dc0 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
27dd0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
27de0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
27df0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
27e00 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
27e10 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
27e20 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
27e30 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
27e40 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
27e50 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
27e60 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
27e70 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
27e80 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
27e90 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
27ea0 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
27eb0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
27ec0 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
27ed0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
27ee0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
27ef0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
27f00 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
27f10 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
27f20 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
27f30 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
27f40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
27f50 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
27f60 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
27f70 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
27f80 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
27f90 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
27fa0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
27fb0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
27fc0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
27fd0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
27fe0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
27ff0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
28000 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
28010 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
28020 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
28030 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
28040 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
28050 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
28060 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
28070 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
28080 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
28090 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
280a0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
280b0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
280c0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
280d0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
280e0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
280f0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
28100 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
28110 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
28120 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
28130 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
28140 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
28150 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
28160 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
28170 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
28180 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
28190 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
281a0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
281b0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
281c0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
281d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
281e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
281f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
28200 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
28210 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
28220 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
28230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
28240 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
28250 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
28260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28270 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
28280 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28290 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
282a0 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
282b0 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
282c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
282d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
282e0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
282f0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
28300 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
28310 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
28320 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
28330 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
28340 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
28350 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
28360 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28370 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
28380 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
28390 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
283a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
283b0 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  age]!=0 );.     
283c0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
283d0 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
283e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
283f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
28400 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
28410 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
28420 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
28430 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
28440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
28460 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
28470 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  ge==(-1) );.    
28480 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
28490 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
284a0 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
284b0 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
284c0 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20  Page[0],.       
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67   0, pCur->curPag
284f0 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  erFlags);.    if
28500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28510 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
28520 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
28530 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
28540 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28550 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
28560 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
28570 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
28580 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
28590 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  y;.  }.  pRoot =
285a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
285b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
285c0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
285d0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
285e0 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
285f0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
28600 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
28610 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
28620 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
28630 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
28640 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
28650 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
28660 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
28670 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
28680 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
28690 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
286a0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
286b0 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
286c0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
286d0 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
286e0 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
286f0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
28700 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
28710 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
28720 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
28730 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
28740 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
28750 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
28760 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
28770 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
28780 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
28790 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
287a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
287b0 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
287c0 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
287d0 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
287e0 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
287f0 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
28800 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
28810 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
28820 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
28830 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
28840 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
28850 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
28860 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
28870 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
28880 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
28890 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
288a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
288b0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  KPT;.  }..  pCur
288c0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
288d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
288e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
288f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
28900 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
28910 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
28920 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28  lidOvfl);..  if(
28930 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20   pRoot->nCell>0 
28940 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
28950 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
28960 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
28970 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
28980 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
28990 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
289a0 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
289b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
289c0 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
289d0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
289e0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
289f0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
28a00 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
28a10 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
28a20 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
28a30 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
28a40 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
28a50 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
28a60 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
28a70 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ID;.  }.  return
28a80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
28a90 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
28aa0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
28ab0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
28ac0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
28ad0 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
28ae0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
28af0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
28b00 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
28b10 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
28b20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
28b30 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
28b40 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
28b50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
28b60 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
28b70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
28b80 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
28b90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28ba0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
28bb0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
28bc0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28bd0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28be0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28bf0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28c00 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
28c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
28c20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28c30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28c40 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
28c50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
28c60 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28c70 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
28c80 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
28c90 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
28ca0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
28cb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
28cc0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
28cd0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
28ce0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28cf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
28d00 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
28d10 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
28d20 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
28d30 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
28d40 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
28d50 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
28d60 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
28d70 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
28d80 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
28d90 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
28da0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
28db0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
28dc0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
28dd0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
28de0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
28df0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
28e00 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
28e10 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
28e20 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
28e30 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
28e40 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
28e50 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
28e60 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
28e70 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
28e80 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
28e90 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
28ea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
28eb0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
28ec0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
28ed0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
28ee0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28ef0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
28f00 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
28f10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28f20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28f30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28f40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28f50 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
28f60 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28f70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28f80 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
28f90 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
28fa0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
28fb0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
28fc0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
28fd0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28fe0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
28ff0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
29000 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
29010 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
29020 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
29030 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29040 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
29050 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73  e->nCell-1;.  as
29060 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29070 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61  .nSize==0 );.  a
29080 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
29090 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
290a0 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20  lidNKey)==0 );. 
290b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
290c0 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  K;.}../* Move th
290d0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
290e0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
290f0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
29100 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
29110 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
29120 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
29130 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
29140 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
29150 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
29160 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
29170 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
29180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29190 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
291a0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
291b0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
291c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
291d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
291e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
291f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29200 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
29210 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
29220 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
29230 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
29240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29250 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
29260 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29270 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
29280 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
29290 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
292a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
292b0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
292c0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
292d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
292e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
292f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29300 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
29310 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
29320 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
29330 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
29340 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
29350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
29360 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29370 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
29380 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
29390 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
293a0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
293b0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
293c0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
293d0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
293e0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
293f0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
29400 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
29410 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
29420 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
29430 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29440 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
29450 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
29460 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
29470 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
29480 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29490 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
294a0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
294b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
294c0 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
294d0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
294e0 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
294f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
29500 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
29510 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
29520 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
29530 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
29540 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
29550 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
29560 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
29570 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
29580 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
29590 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
295a0 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
295b0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
295c0 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
295d0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
295e0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
295f0 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
29600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29610 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
29620 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
29630 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
29640 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29650 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29660 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
29670 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29680 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
29690 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
296a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
296b0 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
296c0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
296d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
296e0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
296f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
29700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29710 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
29720 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
29730 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
29740 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
29750 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
29760 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29770 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
29780 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
29790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
297a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
297b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
297c0 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
297d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
297e0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
297f0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
29800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29810 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
29820 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
29830 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
29840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29850 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29860 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
29870 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
29880 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
29890 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
298a0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
298b0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
298c0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
298d0 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
298e0 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
298f0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
29900 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
29910 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
29920 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
29930 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
29940 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
29950 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
29960 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
29970 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
29980 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
29990 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
299a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
299b0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
299c0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
299d0 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
299e0 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
299f0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
29a00 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
29a10 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
29a20 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
29a30 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
29a40 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
29a50 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
29a60 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
29a70 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
29a80 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
29a90 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
29aa0 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
29ab0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
29ac0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
29ad0 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
29ae0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
29af0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
29b00 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
29b10 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
29b20 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
29b30 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
29b40 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
29b50 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
29b60 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
29b70 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
29b80 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
29ba0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
29bb0 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
29bc0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
29bd0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
29be0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
29bf0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
29c00 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
29c10 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
29c20 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
29c30 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
29c40 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
29c50 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
29c60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
29c70 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
29c80 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
29c90 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
29ca0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
29cb0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
29cc0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
29cd0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
29cf0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
29d00 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
29d10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
29d20 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
29d30 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
29d40 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
29d50 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
29d60 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
29d70 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
29d80 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
29d90 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
29da0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
29db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29dc0 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
29dd0 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
29de0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
29df0 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
29e00 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
29e10 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
29e20 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
29e30 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
29e40 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
29e50 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
29e60 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
29e70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
29e80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29e90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
29ea0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29eb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29ec0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
29ed0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
29ee0 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
29ef0 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
29f00 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
29f10 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
29f20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
29f30 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
29f40 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
29f50 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
29f60 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
29f70 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
29f80 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
29f90 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
29fa0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29fb0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29fc0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
29fd0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
29fe0 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43  Key)!=0.   && pC
29ff0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20  ur->curIntKey . 
2a000 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2a010 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2a020 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
2a030 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
2a040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
2a060 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2a070 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2a080 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
2a090 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2a0a0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2a0b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2a0c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2a0d0 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
2a0e0 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
2a0f0 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
2a100 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
2a110 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
2a120 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
2a130 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
2a140 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2a150 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
2a160 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2a170 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
2a180 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2a190 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
2a1a0 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2a1b0 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2a1c0 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
2a1d0 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
2a1e0 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
2a1f0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2a200 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2a210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2a220 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a230 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2a240 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a250 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
2a260 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a270 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2a280 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a290 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
2a2a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a2b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2a2c0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
2a2d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a2e0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2a2f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2a300 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2a310 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
2a320 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
2a330 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2a340 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2a350 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a360 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2a370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a380 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
2a390 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
2a3a0 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d  ]->intKey==pCur-
2a3b0 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
2a3c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
2a3d0 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  rIntKey || pIdxK
2a3e0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
2a3f0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
2a400 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50  r, idx, c;.    P
2a410 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
2a420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2a430 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a440 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2a450 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a470 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2a480 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
2a490 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
2a4a0 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
2a4b0 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
2a4c0 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
2a4d0 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
2a4e0 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
2a4f0 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
2a500 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
2a510 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
2a520 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
2a530 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
2a540 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
2a550 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
2a560 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
2a570 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
2a580 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2a590 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
2a5a0 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
2a5b0 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
2a5c0 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
2a5d0 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
2a5e0 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
2a5f0 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
2a600 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
2a610 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
2a620 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
2a630 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
2a640 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
2a650 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2a660 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2a670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a680 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
2a690 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
2a6a0 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
2a6b0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
2a6c0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  1;.    assert( b
2a6d0 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62  iasRight==0 || b
2a6e0 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20  iasRight==1 );. 
2a6f0 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31     idx = upr>>(1
2a700 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20  -biasRight); /* 
2a710 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20  idx = biasRight 
2a720 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72  ? upr : (lwr+upr
2a730 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72  )/2; */.    pCur
2a740 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a750 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2a760 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64  .    if( xRecord
2a770 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
2a780 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2a790 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
2a7a0 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
2a7b0 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2a7c0 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2a7d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2a7e0 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
2a7f0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2a800 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
2a810 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
2a820 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
2a830 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2a840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a850 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a870 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2a880 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2a890 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2a8a0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2a8b0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2a8c0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2a8d0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2a8e0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2a8f0 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2a900 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a910 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2a920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2a930 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2a940 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2a950 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2a960 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2a970 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2a980 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2a990 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2a9a0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a9b0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2a9c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
2a9d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
2a9e0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2a9f0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2aa00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2aa10 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2aa20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2aa30 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2aa40 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2aa50 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2aa60 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2aa70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2aa80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2aa90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2aaa0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2aab0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2aac0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2aad0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2aae0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2aaf0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2ab00 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2ab10 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2ab20 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2ab30 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2ab40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2ab50 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2ab60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2ab70 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2ab80 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2ab90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2aba0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2abb0 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2abc0 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
2abd0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2abe0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
2abf0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
2ac00 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
2ac10 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2ac20 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2ac30 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
2ac40 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
2ac50 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
2ac60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
2ac70 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
2ac80 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
2ac90 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
2aca0 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
2acb0 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
2acc0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
2acd0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
2ace0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
2acf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2ad00 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
2ad10 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
2ad20 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
2ad30 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
2ad40 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
2ad50 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
2ad60 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
2ad70 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
2ad80 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
2ad90 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
2ada0 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2adb0 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
2adc0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
2add0 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
2ade0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
2adf0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2ae00 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
2ae10 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
2ae20 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
2ae30 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
2ae40 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
2ae50 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2ae60 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
2ae70 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2ae80 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
2ae90 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
2aea0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2aeb0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2aec0 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
2aed0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2aee0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2aef0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2af00 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
2af10 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2af20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
2af30 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
2af40 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
2af50 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
2af60 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
2af70 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
2af80 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
2af90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2afa0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2afb0 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
2afc0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2afd0 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
2afe0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
2aff0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
2b000 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2b010 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b020 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
2b030 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2b040 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2b050 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2b060 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2b070 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
2b080 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2b090 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2b0a0 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
2b0b0 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
2b0c0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2b0d0 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
2b0e0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
2b0f0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
2b100 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
2b110 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
2b120 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
2b130 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
2b140 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
2b150 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
2b160 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
2b170 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
2b180 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
2b190 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
2b1a0 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
2b1b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2b1c0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
2b1d0 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
2b1e0 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
2b1f0 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
2b200 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
2b210 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
2b220 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
2b230 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
2b240 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
2b250 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
2b260 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
2b270 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
2b280 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
2b290 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2b2a0 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
2b2b0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2b2c0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
2b2d0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
2b2e0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
2b2f0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
2b300 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
2b310 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2b320 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
2b330 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
2b340 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
2b350 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
2b360 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
2b370 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
2b380 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
2b390 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
2b3a0 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
2b3b0 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
2b3c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2b3d0 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
2b3e0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2b3f0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
2b400 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2b410 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
2b420 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2b430 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2b440 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
2b450 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b460 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
2b470 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
2b480 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
2b490 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2b4a0 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20  Cell<2 ){.      
2b4b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b4c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2b4e0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2b4f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b500 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
2b510 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2b520 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
2b530 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
2b540 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
2b550 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b560 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2b570 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2b580 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2b590 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2b5a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2b5b0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2b5c0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2b5d0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2b5e0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2b5f0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2b600 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20  pCellKey, 2);.  
2b610 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b620 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2b630 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2b640 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2b650 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2b660 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2b670 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
2b680 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2b690 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2b6a0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2b6b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b6c0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2b6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2b6e0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2b6f0 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2b700 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2b710 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2b720 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2b730 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2b740 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2b750 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2b760 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2b770 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2b780 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2b790 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2b7a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2b7b0 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2b7c0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2b7d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2b7e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b7f0 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2b800 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2b810 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2b820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2b830 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b840 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2b850 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2b860 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2b870 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2b880 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2b890 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2b8a0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2b8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b8c0 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2b8d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2b8e0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2b8f0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2b900 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2b910 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2b920 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2b930 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2b940 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2b950 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2b960 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2b970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2b980 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2b990 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2b9a0 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2b9b0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2b9c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
2b9d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b9e0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
2b9f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
2ba00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2ba10 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2ba20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2ba30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ba40 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2ba50 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2ba60 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2ba70 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2ba80 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2ba90 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2baa0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2bab0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2bac0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2bad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bae0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2baf0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2bb00 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2bb10 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2bb20 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2bb30 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2bb40 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2bb50 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2bb60 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2bb70 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2bb80 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2bb90 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2bba0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2bbb0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2bbc0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2bbd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bbe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2bbf0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2bc00 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2bc10 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2bc20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2bc30 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2bc40 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2bc50 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2bc60 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2bc70 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2bc80 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2bc90 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2bca0 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2bcb0 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2bcc0 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2bcd0 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2bce0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2bcf0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2bd00 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2bd10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2bd20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2bd30 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2bd40 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2bd50 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2bd60 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2bd70 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2bd80 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2bd90 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2bda0 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2bdb0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2bdc0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2bdd0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2bde0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2bdf0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2be00 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2be10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2be20 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2be30 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2be40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2be50 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2be60 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2be70 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2be80 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2be90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2bea0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2beb0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2bec0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2bed0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2bee0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2bef0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2bf00 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2bf10 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2bf20 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2bf30 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2bf40 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2bf50 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
2bf60 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2bf70 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2bf80 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2bf90 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
2bfa0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2bfb0 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2bfc0 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
2bfd0 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
2bfe0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2bff0 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2c000 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2c010 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
2c020 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
2c030 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2c040 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2c050 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2c060 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2c070 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2c080 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2c090 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2c0a0 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2c0b0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2c0c0 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2c0d0 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2c0e0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2c0f0 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2c100 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2c110 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2c120 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2c130 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2c140 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2c150 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2c160 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2c170 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2c180 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2c190 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2c1a0 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2c1b0 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2c1c0 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2c1d0 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2c1e0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2c1f0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2c200 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2c210 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2c220 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2c230 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2c240 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2c250 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2c260 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2c270 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2c280 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
2c290 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2c2a0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2c2b0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
2c2c0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2c2d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2c2e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2c2f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c300 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2c310 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2c320 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2c330 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2c340 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2c350 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2c360 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2c370 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2c380 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2c390 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2c3a0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2c3b0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2c3c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2c3d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c3e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2c3f0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2c400 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2c410 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2c420 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2c430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c440 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2c450 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2c460 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2c470 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2c480 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2c490 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c4a0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2c4b0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2c4c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2c4d0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2c4e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2c4f0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2c500 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2c510 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c520 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2c530 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2c540 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2c550 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2c560 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c570 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2c580 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2c590 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2c5a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2c5b0 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2c5c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c5d0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2c5e0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2c5f0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2c600 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2c610 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2c620 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2c630 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2c640 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2c650 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2c660 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2c670 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2c680 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2c690 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2c6a0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2c6b0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2c6c0 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2c6d0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2c6e0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2c6f0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2c700 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2c710 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2c720 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2c730 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2c740 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2c750 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2c760 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2c770 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2c780 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2c790 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2c7a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2c7b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2c7c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2c7d0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2c7e0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2c7f0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2c800 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2c810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2c820 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2c830 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2c840 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2c850 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c870 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2c880 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2c890 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2c8a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c8b0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2c8c0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2c8d0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
2c8e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2c8f0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2c900 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2c910 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2c920 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2c930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c950 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2c960 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2c970 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c980 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2c990 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2c9a0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2c9b0 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2c9c0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2c9d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2c9e0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2c9f0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2ca00 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2ca10 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2ca20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2ca30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2ca40 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2ca50 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2ca60 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2ca70 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2ca80 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ca90 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2caa0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2cab0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2cac0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2cad0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2cae0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2caf0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2cb00 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2cb10 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2cb20 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2cb30 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2cb40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2cb50 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  e];.  if( (++pCu
2cb60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2cb70 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e  Page])>=pPage->n
2cb80 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2cb90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2cba0 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75  age]--;.    retu
2cbb0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2cbc0 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2cbd0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2cbe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2cbf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2cc00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2cc10 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2cc20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2cc30 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2cc40 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2cc50 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2cc60 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2cc70 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2cc80 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2cc90 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2cca0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2ccb0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2ccc0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2ccd0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cce0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2ccf0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2cd00 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2cd10 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2cd20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2cd30 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2cd40 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61  Previous().  Tha
2cd50 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2cd60 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2cd70 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2cd80 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e   merely decremen
2cd90 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2cda0 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2cdb0 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70  iIdx.** to the p
2cdc0 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20  revious cell on 
2cdd0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2cde0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2cdf0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a  btreePrevious().
2ce00 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  ** helper routin
2ce10 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2ce20 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2ce30 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2ce40 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  fferent page.** 
2ce50 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  or to restore th
2ce60 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2ce70 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2ce80 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2ce90 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2cea0 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2ceb0 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2cec0 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2ced0 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2cee0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2cef0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2cf00 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2cf10 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2cf20 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2cf30 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2cf40 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2cf50 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2cf60 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2cf70 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2cf80 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2cf90 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2cfa0 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2cfb0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2cfc0 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2cfd0 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2cfe0 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2cff0 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2d000 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2d010 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2d020 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2d030 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2d040 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2d050 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2d060 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2d070 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2d080 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2d090 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2d0a0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2d0b0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2d0c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2d0d0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2d0e0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2d0f0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2d100 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2d110 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2d120 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2d130 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2d140 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2d150 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2d160 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2d170 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2d190 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2d1a0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2d1b0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2d1c0 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2d1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d1e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2d1f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2d200 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d210 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2d220 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2d230 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2d240 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2d260 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d270 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2d280 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2d290 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2d2a0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2d2b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d2c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2d2d0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2d2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2d2f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d300 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2d310 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d320 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2d330 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d340 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2d350 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2d360 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2d370 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2d380 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2d390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d3a0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2d3b0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d3c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2d3d0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2d3e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d3f0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2d400 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d410 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d420 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2d430 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2d440 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d450 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2d460 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2d470 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2d480 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2d490 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2d4a0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2d4b0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2d4c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2d4d0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2d4e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2d4f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2d500 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2d510 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2d520 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2d530 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2d540 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2d550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d560 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2d570 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2d580 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2d590 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2d5a0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2d5b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2d5c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2d5d0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2d5e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
2d5f0 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
2d600 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d610 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
2d620 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d630 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2d640 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2d650 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2d660 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2d670 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2d680 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2d690 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d6a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d6b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2d6c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2d6d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2d6e0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2d6f0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2d700 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2d710 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2d720 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d730 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2d740 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2d750 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2d760 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2d770 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2d780 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d790 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
2d7a0 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  s = 0;.  pCur->c
2d7b0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2d7c0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2d7d0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2d7e0 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  idNKey);.  pCur-
2d7f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2d800 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d810 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d820 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69  D.   || pCur->ai
2d830 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d840 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  ==0.   || pCur->
2d850 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d860 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  ge]->leaf==0.  )
2d870 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2d880 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2d890 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   pRes);.  }.  pC
2d8a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d8b0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75  iPage]--;.  retu
2d8c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d8d0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2d8e0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2d8f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d900 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2d910 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2d920 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2d930 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2d940 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2d950 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
2d960 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
2d970 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
2d980 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
2d990 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
2d9a0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
2d9b0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
2d9c0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2d9d0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
2d9e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
2d9f0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2da00 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
2da10 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2da20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2da30 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
2da40 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
2da50 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
2da60 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
2da70 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
2da80 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
2da90 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
2daa0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
2dab0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
2dac0 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
2dad0 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
2dae0 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
2daf0 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
2db00 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
2db10 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
2db20 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
2db30 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
2db40 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
2db50 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
2db60 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2db70 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
2db80 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
2db90 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2dba0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
2dbb0 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
2dbc0 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
2dbd0 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
2dbe0 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
2dbf0 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
2dc00 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2dc10 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
2dc20 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
2dc30 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
2dc40 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
2dc50 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
2dc60 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
2dc70 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2dc80 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
2dc90 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
2dca0 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
2dcb0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
2dcc0 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
2dcd0 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
2dce0 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
2dcf0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2dd00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2dd10 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
2dd20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2dd30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2dd40 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
2dd50 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
2dd60 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
2dd70 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
2dd80 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
2dd90 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
2dda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
2ddb0 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
2ddc0 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
2ddd0 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
2dde0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2ddf0 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
2de00 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
2de10 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
2de20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
2de30 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
2de40 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
2de50 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
2de60 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
2de70 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
2de80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2de90 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2dea0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
2deb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2dec0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
2ded0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
2dee0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
2def0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
2df00 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
2df10 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
2df20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
2df30 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2df40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2df50 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2df60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2df70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2df80 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2df90 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
2dfa0 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
2dfb0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
2dfc0 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
2dfd0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2dfe0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
2dff0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2e000 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
2e010 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
2e020 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
2e030 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2e040 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
2e050 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
2e060 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
2e070 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2e080 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
2e090 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
2e0a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e0b0 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
2e0c0 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
2e0d0 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
2e0e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2e0f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2e100 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
2e110 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2e120 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
2e130 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
2e140 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
2e150 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
2e160 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
2e170 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
2e180 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
2e190 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
2e1a0 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
2e1b0 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
2e1c0 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
2e1d0 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
2e1e0 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
2e1f0 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
2e200 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
2e210 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
2e220 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
2e230 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
2e240 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
2e250 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
2e260 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
2e270 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2e280 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
2e290 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
2e2a0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
2e2b0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
2e2c0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2e2d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e2e0 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
2e2f0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2e300 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
2e310 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
2e320 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
2e330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e340 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
2e350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2e360 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2e370 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2e380 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
2e390 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
2e3a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2e3b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e3c0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
2e3d0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2e3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
2e3f0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2e400 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e410 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
2e420 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2e430 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
2e440 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
2e450 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
2e460 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
2e470 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
2e480 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
2e490 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
2e4a0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
2e4b0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2e4c0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
2e4d0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
2e4e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2e4f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e500 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2e510 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2e520 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
2e530 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2e540 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
2e550 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
2e560 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
2e570 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
2e580 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
2e590 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
2e5a0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
2e5b0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
2e5c0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
2e5d0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
2e5e0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
2e5f0 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
2e600 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2e610 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
2e620 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2e630 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
2e640 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
2e650 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
2e660 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
2e670 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
2e680 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
2e690 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
2e6a0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
2e6b0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2e6c0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2e6d0 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31  E-OF: R-01506-11
2e6e0 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e  053 The first in
2e6f0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2e700 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2e710 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65         ** is the
2e720 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2e730 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73  the next freelis
2e740 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2e750 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20  the list or.    
2e760 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74      ** zero if t
2e770 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  his is the last 
2e780 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2e790 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
2e7a0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2e7b0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
2e7c0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2e7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2e7e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2e7f0 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65  -59841-13798 The
2e800 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2e810 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
2e820 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20  fset 32.        
2e830 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61  ** stores the pa
2e840 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2e850 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
2e860 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20  he freelist, or 
2e870 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20  zero if.        
2e880 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
2e890 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  is empty. */.   
2e8a0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
2e8b0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2e8c0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2e8d0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
2e8e0 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
2e8f0 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
2e900 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c  iTrunk>mxPage ||
2e910 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29   nSearch++ > n )
2e920 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2e930 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2e940 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
2e950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
2e960 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2e970 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2e980 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2e990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2e9a0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
2e9b0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
2e9c0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2e9d0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
2e9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2e9f0 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
2ea00 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
2ea10 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
2ea20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2ea30 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
2ea40 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
2ea50 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
2ea60 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
2ea70 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
2ea80 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
2ea90 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
2eaa0 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
2eab0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2eac0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
2ead0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
2eae0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
2eaf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2eb00 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
2eb10 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
2eb20 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
2eb30 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
2eb40 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
2eb50 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
2eb60 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
2eb70 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
2eb80 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2eb90 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
2eba0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
2ebb0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
2ebc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ebd0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2ebe0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ebf0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ec00 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ec10 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2ec20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ec30 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2ec40 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2ec50 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2ec60 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
2ec70 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2ec80 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
2ec90 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
2eca0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2ecb0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2ecc0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
2ecd0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
2ece0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
2ecf0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
2ed00 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
2ed10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2ed20 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
2ed30 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
2ed40 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
2ed50 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2ed60 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
2ed70 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2ed80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2ed90 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2eda0 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
2edb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2edc0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
2edd0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
2ede0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
2edf0 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
2ee00 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
2ee10 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2ee20 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2ee30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2ee40 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
2ee50 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
2ee60 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
2ee70 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
2ee80 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
2ee90 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
2eea0 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
2eeb0 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
2eec0 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
2eed0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
2eee0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
2eef0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
2ef00 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
2ef10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ef20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2ef30 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2ef40 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2ef50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2ef60 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2ef70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2ef80 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
2ef90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2efa0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2efb0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2efc0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2efd0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
2efe0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2eff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f000 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2f010 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f020 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
2f030 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2f040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2f060 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f070 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f080 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f090 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2f0a0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2f0b0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
2f0c0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2f0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f0e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f0f0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
2f100 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
2f110 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
2f120 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
2f130 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2f140 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
2f150 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
2f160 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
2f170 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
2f180 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
2f190 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
2f1a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
2f1b0 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
2f1c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
2f1d0 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
2f1e0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2f1f0 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
2f200 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
2f210 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
2f220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2f230 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2f240 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2f250 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2f260 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2f270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
2f280 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
2f290 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2f2a0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2f2b0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
2f2c0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
2f2d0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
2f2e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2f2f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f300 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2f310 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2f320 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f330 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f340 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f350 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
2f360 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2f370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2f390 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
2f3a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2f3b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f3c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f3d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f3e0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2f3f0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2f400 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2f410 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
2f420 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
2f430 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
2f440 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
2f450 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
2f460 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
2f470 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
2f480 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
2f490 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f4a0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2f4b0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
2f4c0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
2f4d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2f4e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2f4f0 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
2f500 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
2f510 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2f520 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2f530 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
2f540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f550 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f560 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f570 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2f580 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2f590 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2f5a0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2f5b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f5c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2f5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
2f5e0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
2f5f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
2f600 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2f610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f620 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2f630 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2f640 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2f650 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2f660 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2f670 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
2f680 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
2f690 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
2f6a0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
2f6b0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
2f6c0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
2f6d0 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
2f6e0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
2f6f0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
2f700 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
2f710 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
2f720 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
2f730 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
2f740 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
2f750 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2f760 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
2f770 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
2f780 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
2f790 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
2f7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f7b0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
2f7c0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
2f7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2f7e0 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
2f7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f800 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2f810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f820 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2f830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f860 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
2f870 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
2f880 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
2f890 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2f8a0 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
2f8b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
2f8c0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2f8e0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
2f8f0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
2f900 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
2f910 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
2f920 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
2f930 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
2f940 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2f950 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
2f960 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
2f970 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f9b0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
2f9c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2f9d0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2f9e0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
2f9f0 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
2fa00 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2fa10 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2fa20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
2fa30 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
2fa40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2fa50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2fa60 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2fa70 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2fa80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2fa90 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
2faa0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2fab0 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
2fac0 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  t .         || (
2fad0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c  iPage==nearby ||
2fae0 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26   (iPage<nearby &
2faf0 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2fb00 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29  _LE)) .        )
2fb10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2fb20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
2fb30 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
2fb40 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
2fb50 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2fb60 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
2fb70 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
2fb80 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
2fb90 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
2fba0 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2fbc0 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
2fbd0 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
2fbe0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
2fbf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fc00 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2fc10 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fc20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2fc30 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fc40 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fc50 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
2fc60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2fc70 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
2fc80 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
2fc90 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
2fca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fcb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2fcc0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
2fcd0 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
2fce0 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
2fcf0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
2fd00 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45  pPgno)? PAGER_GE
2fd10 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
2fd20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2fd30 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
2fd40 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
2fd50 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
2fd60 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
2fd70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2fd90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fda0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2fdb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2fdc0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2fdd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fde0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2fdf0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
2fe10 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
2fe20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fe30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2fe40 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2fe50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fe60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2fe70 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2fe80 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2fe90 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
2fea0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
2feb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2fec0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
2fed0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2fee0 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
2fef0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
2ff00 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2ff10 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
2ff20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
2ff30 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
2ff40 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
2ff50 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
2ff60 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
2ff70 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
2ff80 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
2ff90 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
2ffa0 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
2ffb0 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
2ffc0 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
2ffd0 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
2ffe0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
2fff0 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
30000 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
30010 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
30020 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
30030 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
30040 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
30050 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
30060 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
30070 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
30080 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
30090 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
300a0 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
300b0 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
300c0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
300d0 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
300e0 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
300f0 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
30100 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
30110 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
30120 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
30130 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
30140 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
30150 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
30160 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
30170 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
30180 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
30190 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
301a0 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
301b0 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
301c0 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
301d0 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
301e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
301f0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
30200 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
30210 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
30220 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
30230 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
30240 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
30250 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
30260 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
30270 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
30280 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
30290 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
302a0 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
302b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
302c0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
302d0 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
302e0 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
302f0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
30300 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
30310 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
30320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30330 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
30340 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
30350 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
30360 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
30370 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
30380 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
30390 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
303a0 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
303b0 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
303c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
303d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
303e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
303f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
30400 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
30410 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
30420 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
30430 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
30440 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
30450 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
30460 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
30470 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
30480 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
30490 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
304a0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
304b0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
304c0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
304d0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
304e0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
304f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
30500 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
30510 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
30520 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
30530 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
30540 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
30550 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
30560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
30570 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
30580 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
30590 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
305a0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
305b0 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
305c0 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
305d0 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
305e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
305f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30600 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30610 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
30620 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30630 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
30640 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
30650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30660 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
30670 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
30680 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
30690 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
306a0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
306b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
306c0 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
306d0 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
306e0 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
306f0 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
30700 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
30710 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
30720 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
30730 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
30740 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30750 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
30760 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
30770 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
30780 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30790 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
307a0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
307b0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
307c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
307d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
307e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
307f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
30800 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
30810 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
30820 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
30830 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
30840 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
30850 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
30860 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
30870 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
30880 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
30890 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
308a0 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
308b0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
308c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
308d0 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
308e0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
308f0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
30900 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61  bPage)<=1 );.  a
30910 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
30920 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65  E_OK || (*ppPage
30930 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  )->isInit==0 );.
30940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30950 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
30960 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
30970 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
30980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30990 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
309a0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
309b0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
309c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
309d0 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
309e0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
309f0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
30a00 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
30a10 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
30a20 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
30a30 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
30a40 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
30a50 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
30a60 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
30a70 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
30a80 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
30a90 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
30aa0 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
30ab0 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
30ac0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
30ad0 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
30ae0 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
30af0 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
30b00 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
30b10 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
30b20 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
30b30 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
30b40 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
30b50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
30b60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
30b70 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
30b80 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
30b90 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
30ba0 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
30bb0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30bd0 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
30be0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
30bf0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
30c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30c10 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
30c20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
30c30 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
30c40 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
30c50 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
30c60 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
30c70 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
30c80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
30c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ca0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
30cb0 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
30cc0 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
30cd0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
30ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cf0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
30d00 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
30d30 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
30d40 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
30d50 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
30d60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
30d70 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
30d80 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
30d90 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20  T_DB || iPage>1 
30da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
30db0 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
30dc0 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
30dd0 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c  );..  if( iPage<
30de0 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  2 ) return SQLIT
30df0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30e00 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
30e10 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
30e20 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
30e30 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
30e40 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
30e50 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
30e60 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
30e70 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
30e80 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
30e90 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
30ea0 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
30eb0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
30ec0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
30ed0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
30ee0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
30ef0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
30f00 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
30f10 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30f20 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
30f30 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30f40 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
30f50 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
30f60 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
30f70 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
30f80 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
30f90 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
30fa0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
30fb0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
30fc0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
30fd0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
30fe0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
30ff0 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
31000 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
31010 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
31020 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
31030 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
31040 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
31050 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31060 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
31070 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
31080 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
31090 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
310a0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
310b0 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
310c0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
310d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
310e0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
310f0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
31100 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
31110 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
31120 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
31130 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
31140 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
31150 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
31160 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
31170 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
31180 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
31190 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
311a0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
311b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
311c0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
311d0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
311e0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
311f0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
31200 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
31210 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
31220 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
31230 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
31240 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
31250 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
31260 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
31270 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
31280 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
31290 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
312a0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
312b0 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
312c0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
312d0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
312e0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
312f0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
31300 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
31310 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
31320 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
31330 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
31340 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
31350 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
31360 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
31370 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
31380 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
31390 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
313a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
313b0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
313c0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
313d0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
313e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
313f0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
31400 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31410 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
31420 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
31430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31440 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
31450 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
31460 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
31470 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
31480 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
31490 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
314a0 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
314b0 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
314c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
314d0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
314e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
314f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
31500 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
31520 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
31530 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
31540 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
31550 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
31560 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
31570 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
31580 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
31590 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
315a0 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
315b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
315c0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
315d0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
315e0 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
315f0 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
31600 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
31610 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
31620 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
31630 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
31640 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
31650 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
31660 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
31670 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
31680 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
31690 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
316a0 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
316b0 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
316c0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
316d0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
316e0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
316f0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
31700 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
31710 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
31720 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
31730 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
31740 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
31750 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
31760 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
31770 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
31780 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
31790 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
317a0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
317b0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
317c0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
317d0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
317e0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
317f0 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
31800 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
31810 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
31820 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
31830 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
31840 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
31850 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
31860 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
31870 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
31880 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
31890 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a  /4-8"..      **.
318a0 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
318b0 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31  E-OF: R-19920-11
318c0 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77  576 However, new
318d0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
318e0 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20  QLite still.    
318f0 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67    ** avoid using
31900 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e   the last six en
31910 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65  tries in the fre
31920 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
31930 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20   array in.      
31940 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61  ** order that da
31950 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
31960 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  ated by newer ve
31970 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
31980 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a   can be.      **
31990 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76   read by older v
319a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
319b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
319c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
319d0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
319e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
319f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31a00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
31a10 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
31a20 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
31a30 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
31a40 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
31a50 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
31a60 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
31a70 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
31a80 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
31a90 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
31aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
31ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
31ac0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
31ad0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
31ae0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
31af0 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
31b00 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
31b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
31b20 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
31b30 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
31b40 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
31b50 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
31b60 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
31b70 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
31b90 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
31ba0 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
31bb0 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
31bc0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
31bd0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
31be0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
31bf0 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
31c00 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
31c10 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
31c20 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
31c30 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
31c40 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
31c50 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
31c60 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
31c70 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
31c80 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
31c90 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
31ca0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
31cb0 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
31cc0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
31cd0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
31ce0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
31cf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
31d00 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
31d10 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
31d20 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
31d30 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
31d40 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
31d50 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
31d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31d70 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
31d80 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
31d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31da0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
31db0 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
31dc0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
31dd0 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
31de0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
31df0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
31e00 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31e10 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
31e20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
31e30 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
31e40 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
31e50 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
31e60 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
31e70 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
31e80 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
31e90 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
31ea0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
31eb0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31ec0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
31ed0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
31ee0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
31ef0 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
31f00 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
31f10 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
31f20 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
31f30 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
31f40 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
31f50 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
31f60 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
31f70 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
31f80 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
31f90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
31fa0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72   given Cell.  Wr
31fb0 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c  ite the.** local
31fc0 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20   Cell size (the 
31fd0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
31fe0 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  on the original 
31ff0 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a  page, omitting.*
32000 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f  * overflow) into
32010 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61   *pnSize..*/.sta
32020 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
32030 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
32040 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
32050 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
32060 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c  ontains the Cell
32070 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
32080 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f  har *pCell,    /
32090 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
320a0 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31  the Cell */.  u1
320b0 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  6 *pnSize       
320c0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
320d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
320e0 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  Cell here */.){.
320f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
32100 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
32110 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
32120 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
32130 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
32140 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
32150 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
32160 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
32170 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
32180 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
32190 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
321a0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
321b0 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69   &info);.  *pnSi
321c0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
321d0 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
321e0 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
321f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32200 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
32210 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
32220 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
32230 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
32240 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69  if( pCell+info.i
32250 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61  Overflow+3 > pPa
32260 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
32270 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20  >maskPage ){.   
32280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
32290 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a  ORRUPT_BKPT;  /*
322a0 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61   Cell extends pa
322b0 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a  st end of page *
322c0 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
322d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
322e0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
322f0 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w]);.  assert( p
32300 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
32310 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
32320 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
32330 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
32340 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
32350 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
32360 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
32370 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
32380 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
32390 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28  Ovfl>0 || .    (
323a0 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 69  CORRUPT_DB && (i
323b0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f  nfo.nPayload + o
323c0 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66  vflPageSize)<ovf
323d0 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a  lPageSize).  );.
323e0 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
323f0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
32400 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
32410 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
32420 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
32430 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
32440 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
32450 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
32460 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
32470 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
32480 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
32490 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
324a0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
324b0 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
324c0 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
324d0 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
324e0 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
324f0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
32500 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
32510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32520 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
32530 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
32540 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
32550 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
32560 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
32570 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
32580 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
32590 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
325a0 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
325b0 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
325c0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
325d0 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
325e0 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
325f0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
32600 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
32610 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
32620 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
32630 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
32640 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
32650 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
32660 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
32670 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
32680 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
32690 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
326a0 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
326b0 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
326c0 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
326d0 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
326e0 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
326f0 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
32700 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
32710 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
32720 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
32730 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
32740 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
32750 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
32760 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
32770 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
32780 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
32790 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
327a0 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
327b0 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
327c0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
327d0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
327e0 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
327f0 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
32800 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
32810 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
32820 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
32830 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
32840 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
32850 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
32860 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
32870 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
32880 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
32890 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
328a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
328b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
328c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
328d0 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
328e0 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
328f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
32900 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
32910 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
32920 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
32930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32940 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
32950 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
32960 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
32970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32980 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
32990 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
329a0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
329b0 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
329c0 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
329d0 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
329e0 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
329f0 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
32a00 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
32a10 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
32a20 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
32a30 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
32a40 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
32a50 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
32a60 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
32a70 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
32a80 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
32a90 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
32aa0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
32ab0 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
32ac0 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
32ad0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
32ae0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
32af0 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
32b00 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
32b10 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
32b20 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
32b30 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
32b40 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
32b50 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
32b60 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
32b70 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
32b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
32b90 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
32ba0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
32bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32bc0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
32bd0 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
32be0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
32bf0 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
32c00 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
32c10 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
32c20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
32c30 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
32c40 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
32c50 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
32c60 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
32c70 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
32c80 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
32c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ca0 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
32cb0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
32cc0 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
32cd0 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32cf0 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
32d00 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
32d10 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
32d20 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
32d30 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
32d40 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
32d50 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
32d60 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
32d70 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
32d80 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
32d90 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
32da0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
32db0 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
32dc0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
32dd0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
32de0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
32df0 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65  nHeader;..  asse
32e00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
32e10 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
32e20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
32e30 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
32e40 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
32e50 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
32e60 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
32e70 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
32e80 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
32e90 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
32ea0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
32eb0 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
32ec0 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
32ed0 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
32ee0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
32ef0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
32f00 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
32f10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
32f20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
32f30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
32f40 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
32f50 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  .  nHeader = pPa
32f60 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
32f70 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  ;.  nPayload = n
32f80 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
32f90 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
32fa0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  yLeaf ){.    nHe
32fb0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
32fc0 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
32fd0 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
32fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
32ff0 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b  ert( nData==0 );
33000 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65  .    assert( nZe
33010 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e  ro==0 );.  }.  n
33020 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
33030 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
33040 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
33050 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c  y);.  .  /* Fill
33060 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
33070 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  size */.  if( pP
33080 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
33090 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
330a0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
330b0 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
330c0 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
330d0 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d 30 78  assert( nKey<=0x
330e0 37 66 66 66 66 66 66 66 20 26 26 20 70 4b 65 79  7fffffff && pKey
330f0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 61 79 6c  !=0 );.    nPayl
33100 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  oad = (int)nKey;
33110 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
33120 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
33130 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  t)nKey;.  }.  if
33140 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
33150 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
33160 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b     n = nHeader +
33170 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74   nPayload;.    t
33180 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b  estcase( n==3 );
33190 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
331a0 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==4 );.    if( n
331b0 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20  <4 ) n = 4;.    
331c0 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  *pnSize = n;.   
331d0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61   spaceLeft = nPa
331e0 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f  yload;.    pPrio
331f0 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c  r = pCell;.  }el
33200 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d  se{.    int mn =
33210 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
33220 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28  ;.    n = mn + (
33230 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25  nPayload - mn) %
33240 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
33250 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
33260 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
33270 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
33280 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
33290 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
332a0 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
332b0 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c   n > pPage->maxL
332c0 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20  ocal ) n = mn;. 
332d0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
332e0 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
332f0 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b  n + nHeader + 4;
33300 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70  .    pPrior = &p
33310 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b  Cell[nHeader+n];
33320 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20  .  }.  pPayload 
33330 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
33340 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  ];..  /* At this
33350 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
33360 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
33370 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
33380 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
33390 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
333a0 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
333b0 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
333c0 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
333d0 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
333e0 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
333f0 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
33400 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
33410 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
33420 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
33430 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
33460 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
33470 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
33480 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
33490 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
334a0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
334b0 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
334c0 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
334d0 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
334e0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
334f0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
33500 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
33510 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
33520 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
33530 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
33540 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
33550 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
33560 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
33570 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
33580 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
33590 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  /.#if SQLITE_DEB
335a0 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
335b0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50  nfo info;.    pP
335c0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
335d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
335e0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
335f0 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28  ( nHeader=(int)(
33600 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20  info.pPayload - 
33610 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73  pCell) );.    as
33620 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
33630 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73  =nKey );.    ass
33640 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20  ert( *pnSize == 
33650 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
33660 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c    assert( spaceL
33670 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  eft == info.nLoc
33680 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
33690 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65  ( pPrior == &pCe
336a0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
336b0 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  w] );.  }.#endif
336c0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
336d0 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68   payload into th
336e0 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64  e local Cell and
336f0 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20   any extra into 
33700 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a  overflow pages *
33710 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  /.  while( nPayl
33720 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
33730 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
33740 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33750 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33760 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
33770 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
33780 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
33790 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
337a0 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
337b0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
337c0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
337d0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
337e0 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
337f0 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
33800 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
33810 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
33820 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
33830 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
33840 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
33850 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
33860 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
33870 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
33880 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
33890 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
338a0 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
338b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
338c0 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
338d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
338e0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
338f0 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
33900 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
33910 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
33920 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
33930 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
33940 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
33950 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
33960 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
33970 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
33980 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
33990 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
339a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
339b0 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
339c0 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
339d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
339e0 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
339f0 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
33a00 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
33a10 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
33a20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
33a30 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
33a40 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
33a50 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
33a60 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
33a70 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
33a80 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
33a90 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
33aa0 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
33ab0 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
33ac0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
33ad0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
33ae0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
33af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33b00 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
33b10 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
33b20 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
33b30 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
33b40 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
33b50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
33b60 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
33b70 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
33b80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
33b90 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
33ba0 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
33bb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
33bc0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
33bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
33be0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
33bf0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
33c00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
33c10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
33c20 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
33c30 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
33c40 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
33c50 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
33c60 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
33c70 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
33c80 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
33c90 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
33ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
33cb0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
33cc0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
33cd0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
33ce0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
33cf0 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
33d00 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
33d10 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
33d20 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
33d30 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
33d40 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
33d50 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
33d60 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
33d70 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
33d80 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
33d90 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
33da0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
33db0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
33dc0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
33dd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
33de0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
33df0 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
33e00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
33e10 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
33e20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
33e30 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
33e40 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
33e50 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
33e60 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
33e70 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
33e80 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
33e90 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
33ea0 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
33eb0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
33ec0 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
33ed0 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
33ee0 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
33ef0 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
33f00 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
33f10 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
33f20 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
33f30 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
33f40 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
33f50 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
33f60 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
33f70 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
33f80 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
33f90 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
33fa0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
33fb0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
33fc0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
33fd0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
33fe0 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
33ff0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
34000 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
34010 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
34020 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
34030 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
34040 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
34050 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
34060 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
34070 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
34080 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
34090 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
340a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
340b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
340c0 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
340d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
340e0 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
340f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
34100 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
34110 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
34120 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
34130 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
34140 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
34150 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
34160 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
34170 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
34180 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
34190 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
341a0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
341b0 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
341c0 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
341d0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
341e0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
341f0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
34200 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
34210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34220 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
34230 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
34240 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
34250 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
34260 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
34270 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
34280 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
34290 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
342a0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
342b0 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
342c0 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
342d0 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
342e0 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
342f0 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
34300 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
34310 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
34320 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
34330 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
34340 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
34350 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
34360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
34370 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
34380 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
34390 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52   int sz, int *pR
343a0 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20  C){.  u32 pc;   
343b0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
343c0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
343d0 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
343e0 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
343f0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
34400 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
34410 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
34420 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
34430 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
34440 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
34450 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
34460 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
34470 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
34480 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
34490 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
344a0 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
344b0 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
344c0 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
344d0 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
344e0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
344f0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
34500 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
34510 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c  PT_DB || sz==cel
34520 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
34530 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
34540 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
34550 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
34560 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
34570 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
34580 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
34590 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
345a0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
345b0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
345c0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
345d0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
345e0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
345f0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
34600 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
34610 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
34620 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
34630 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
34640 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
34650 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
34660 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
34670 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
34680 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
34690 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
346a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
346b0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
346c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
346d0 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
346e0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
346f0 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
34700 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
34710 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
34720 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
34730 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67  ll--;.  if( pPag
34740 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
34750 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
34760 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
34770 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
34780 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65   0;.    put2byte
34790 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
347a0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
347b0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
347c0 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
347d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
347e0 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  e - pPage->hdrOf
347f0 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  fset.           
34800 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50              - pP
34810 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
34820 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e - 8;.  }else{.
34830 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c      memmove(ptr,
34840 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
34850 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
34860 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
34870 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
34880 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
34890 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
348a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
348b0 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
348c0 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
348d0 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
348e0 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
348f0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
34900 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
34910 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
34920 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
34930 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
34940 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
34950 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
34960 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
34970 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
34980 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
34990 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
349a0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
349b0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
349c0 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
349d0 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
349e0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61  Page->apOvfl[] a
349f0 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
34a00 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
34a10 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
34a20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
34a30 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
34a40 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
34a50 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
34a60 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
34a70 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
34a80 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
34a90 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
34aa0 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
34ab0 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61  remented..*/.sta
34ac0 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
34ad0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
34ae0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
34af0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
34b00 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
34b10 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
34b20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
34b30 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
34b40 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
34b50 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
34b60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
34b70 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
34b80 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
34b90 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
34ba0 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
34bb0 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
34bc0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
34bd0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
34be0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
34bf0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
34c00 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
34c10 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
34c20 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
34c30 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
34c40 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
34c50 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
34c60 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
34c70 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
34c80 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
34c90 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
34ca0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
34cb0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
34cc0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
34cd0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
34ce0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
34cf0 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  r */.  u8 *data;
34d00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
34d10 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
34d20 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
34d30 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20  8 *pIns;        
34d40 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e   /* The point in
34d50 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
34d60 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c  [] where no cell
34d70 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20   inserted */..  
34d80 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
34d90 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  n;..  assert( i>
34da0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
34db0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
34dc0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
34dd0 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67  rt( MX_CELL(pPag
34de0 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
34df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34e00 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
34e10 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c  L(pPage->pBt) ||
34e20 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
34e30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34e40 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
34e50 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
34e60 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
34e70 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65   ArraySize(pPage
34e80 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79  ->apOvfl)==Array
34e90 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76  Size(pPage->aiOv
34ea0 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
34eb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
34ec0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
34ed0 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
34ee0 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e  he cell should n
34ef0 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64  ormally be sized
34f00 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77   correctly.  How
34f10 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e  ever, when movin
34f20 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d  g a.  ** malform
34f30 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c  ed cell from a l
34f40 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69  eaf page to an i
34f50 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66  nterior page, if
34f60 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20   the cell size. 
34f70 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65   ** wanted to be
34f80 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74   less than 4 but
34f90 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20   got rounded up 
34fa0 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66  to 4 on the leaf
34fb0 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a  , then size.  **
34fc0 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
34fd0 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65  han 8 (leaf-size
34fe0 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74   + pointer) on t
34ff0 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
35000 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
35010 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65  e term after the
35020 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   || in the follo
35030 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a  wing assert(). *
35040 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  /.  assert( sz==
35050 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
35060 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c  (pPage, pCell) |
35070 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69  | (sz==8 && iChi
35080 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70  ld>0) );.  if( p
35090 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
350a0 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
350b0 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
350c0 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
350d0 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65  emcpy(pTemp, pCe
350e0 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70  ll, sz);.      p
350f0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
35100 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
35110 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
35120 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
35130 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
35140 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
35150 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
35160 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
35170 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  f(pPage->apOvfl)
35180 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
35190 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  pOvfl[0])) );.  
351a0 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
351b0 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
351c0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
351d0 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20   = (u16)i;..    
351e0 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  /* When multiple
351f0 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72   overflows occur
35200 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77 61 79  , they are alway
35210 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64  s sequential and
35220 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65   in.    ** sorte
35230 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  d order.  This i
35240 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73 65 20  nvariants arise 
35250 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65  because multiple
35260 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20   overflows can. 
35270 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72     ** only occur
35280 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
35290 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
352a0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
352b0 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a  ge during.    **
352c0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20   balancing, and 
352d0 74 68 65 20 64 69 76 69 64 65 72 73 20 61 72 65  the dividers are
352e0 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f   adjacent and so
352f0 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
35300 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c   assert( j==0 ||
35310 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
35320 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a  -1]<(u16)i ); /*
35330 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f   Overflows in so
35340 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
35350 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c    assert( j==0 |
35360 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76  | i==pPage->aiOv
35370 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f  fl[j-1]+1 );   /
35380 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20  * Overflows are 
35390 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20  sequential */.  
353a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
353b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
353c0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
353d0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
353e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
353f0 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
35400 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
35410 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
35420 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
35430 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
35440 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
35450 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
35460 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
35470 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
35480 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65  llOffset]==pPage
35490 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20  ->aCellIdx );.  
354a0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
354b0 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
354c0 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
354d0 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
354e0 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
354f0 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
35500 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
35510 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
35520 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73  owing properties
35530 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
35540 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
35550 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ly */.    assert
35560 28 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20  ( idx >= 0 );.  
35570 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
35580 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
35590 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
355a0 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l+2 || CORRUPT_D
355b0 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
355c0 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29   idx+sz <= (int)
355d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
355e0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50  leSize );.    pP
355f0 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
35600 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
35610 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
35620 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  x], pCell, sz);.
35630 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
35640 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
35650 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
35660 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
35670 70 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43  pIns = pPage->aC
35680 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20  ellIdx + i*2;.  
35690 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32    memmove(pIns+2
356a0 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65  , pIns, 2*(pPage
356b0 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20  ->nCell - i));. 
356c0 20 20 20 70 75 74 32 62 79 74 65 28 70 49 6e 73     put2byte(pIns
356d0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67  , idx);.    pPag
356e0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
356f0 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* increment the
35700 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20   cell count */. 
35710 20 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70     if( (++data[p
35720 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
35730 34 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50  4])==0 ) data[pP
35740 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
35750 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ]++;.    assert(
35760 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
35770 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35780 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  +3])==pPage->nCe
35790 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ll );.#ifndef SQ
357a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
357b0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
357c0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
357d0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
357e0 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
357f0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
35800 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
35810 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
35820 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
35830 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
35840 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
35850 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
35860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
35870 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
35880 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
35890 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
358a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
358b0 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74  CellArray object
358c0 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68   contains a cach
358d0 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e  e of pointers an
358e0 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a  d sizes for a.**
358f0 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71   consecutive seq
35900 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74  uence of cells t
35910 68 61 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c  hat might be hel
35920 64 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73  d multiple pages
35930 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
35940 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65  uct CellArray Ce
35950 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20  llArray;.struct 
35960 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e  CellArray {.  in
35970 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
35980 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35990 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
359a0 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ll[] */.  MemPag
359b0 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20  e *pRef;        
359c0 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70    /* Reference p
359d0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
359e0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
359f0 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65   /* All cells be
35a00 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  gin balanced */.
35a10 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20    u16 *szCell;  
35a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
35a30 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
35a40 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
35a50 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61   */.};../*.** Ma
35a60 6b 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c  ke sure the cell
35a70 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69   sizes at idx, i
35a80 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e  dx+1, ..., idx+N
35a90 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  -1 have been.** 
35aa0 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
35ab0 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74  tic void populat
35ac0 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41  eCellCache(CellA
35ad0 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78  rray *p, int idx
35ae0 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
35af0 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
35b00 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b  x+N<=p->nCell );
35b10 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b  .  while( N>0 ){
35b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
35b30 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29  apCell[idx]!=0 )
35b40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43  ;.    if( p->szC
35b50 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20  ell[idx]==0 ){. 
35b60 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69       p->szCell[i
35b70 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78  dx] = p->pRef->x
35b80 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
35b90 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d  , p->apCell[idx]
35ba0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35bb0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
35bc0 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20  UPT_DB ||.      
35bd0 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c          p->szCel
35be0 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d  l[idx]==p->pRef-
35bf0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
35c00 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  ef, p->apCell[id
35c10 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  x]) );.    }.   
35c20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b   idx++;.    N--;
35c30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
35c40 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
35c50 20 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74   the Nth element
35c60 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72   of the cell arr
35c70 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  ay.*/.static SQL
35c80 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36  ITE_NOINLINE u16
35c90 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65   computeCellSize
35ca0 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
35cb0 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
35cc0 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43   N>=0 && N<p->nC
35cd0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
35ce0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30   p->szCell[N]==0
35cf0 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b   );.  p->szCell[
35d00 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43  N] = p->pRef->xC
35d10 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
35d20 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a   p->apCell[N]);.
35d30 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65    return p->szCe
35d40 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20  ll[N];.}.static 
35d50 75 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69  u16 cachedCellSi
35d60 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c  ze(CellArray *p,
35d70 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
35d80 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e  t( N>=0 && N<p->
35d90 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70  nCell );.  if( p
35da0 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65  ->szCell[N] ) re
35db0 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  turn p->szCell[N
35dc0 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70  ];.  return comp
35dd0 75 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e  uteCellSize(p, N
35de0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  );.}../*.** Arra
35df0 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
35e00 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
35e10 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67  nCell b-tree pag
35e20 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a  e cells. The .**
35e30 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20   szCell[] array 
35e40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
35e50 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
35e60 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
35e70 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63  nction.** replac
35e80 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
35e90 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
35ea0 70 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e  pPg with the con
35eb0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c  tents of the cel
35ec0 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  l.** array..**.*
35ed0 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  * Some of the ce
35ee0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
35ef0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
35f00 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20   stored in pPg. 
35f10 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
35f20 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72   works around pr
35f30 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
35f40 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20   this by making 
35f50 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a  a copy of any .*
35f60 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66  * such cells bef
35f70 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
35f80 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
35f90 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65  *.** The MemPage
35fa0 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  .nFree field is 
35fb0 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74  invalidated by t
35fc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  his function. It
35fd0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
35fe0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
35ff0 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
36000 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
36010 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 62 75  .static int rebu
36020 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  ildPage(.  MemPa
36030 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
36040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64             /* Ed
36050 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  it this page */.
36060 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
36070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36080 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65    /* Final numbe
36090 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61  r of cells on pa
360a0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
360b0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
360c0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
360d0 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75   of cells */.  u
360e0 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20  16 *szCell      
360f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36100 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20  * Array of cell 
36110 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  sizes */.){.  co
36120 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
36130 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  g->hdrOffset;   
36140 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
36150 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
36160 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  g */.  u8 * cons
36170 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
36180 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
36190 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
361a0 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20  ta for pPg */.  
361b0 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65  const int usable
361c0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
361d0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75  >usableSize;.  u
361e0 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
361f0 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69   &aData[usableSi
36200 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ze];.  int i;.  
36210 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70  u8 *pCellptr = p
36220 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20  Pg->aCellIdx;.  
36230 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74  u8 *pTmp = sqlit
36240 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
36250 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65  (pPg->pBt->pPage
36260 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b  r);.  u8 *pData;
36270 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  ..  i = get2byte
36280 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b  (&aData[hdr+5]);
36290 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b  .  memcpy(&pTmp[
362a0 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75  i], &aData[i], u
362b0 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a  sableSize - i);.
362c0 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b  .  pData = pEnd;
362d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
362e0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
362f0 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c  8 *pCell = apCel
36300 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  l[i];.    if( pC
36310 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70 43 65  ell>aData && pCe
36320 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  ll<pEnd ){.     
36330 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
36340 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
36350 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d     }.    pData -
36360 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
36370 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
36380 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61  tr, (pData - aDa
36390 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
363a0 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28  tr += 2;.    if(
363b0 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70 74   pData < pCellpt
363c0 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
363d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
363e0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
363f0 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b  , pCell, szCell[
36400 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
36410 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d   szCell[i]==pPg-
36420 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20  >xCellSize(pPg, 
36430 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
36440 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73 74  T_DB );.    test
36450 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21  case( szCell[i]!
36460 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
36470 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20  pPg,pCell) );.  
36480 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
36490 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
364a0 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
364b0 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
364c0 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
364d0 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
364e0 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
364f0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
36500 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
36510 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
36520 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
36530 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
36540 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
36550 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
36560 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
36570 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
36580 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
36590 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
365a0 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
365b0 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
365c0 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
365d0 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
365e0 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  Cell.** contains
365f0 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
36600 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
36610 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
36620 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
36630 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c  .** add the cell
36640 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
36650 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50  array to page pP
36660 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20  g. If it cannot 
36670 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  (because .** the
36680 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
36690 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62  e defragmented b
366a0 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20  efore the cells 
366b0 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a  will fit), non-z
366c0 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
366d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
366e0 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  f the cells are 
366f0 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
36700 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72  ly, zero is.** r
36710 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eturned..**.** A
36720 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72  rgument pCellptr
36730 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
36740 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
36750 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
36760 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66  rray.** (part of
36770 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f   page pPg) to po
36780 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65  pulate. After ce
36790 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20  ll apCell[0] is 
367a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
367b0 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31  * page body, a 1
367c0 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20  6-bit offset is 
367d0 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c  written to pCell
367e0 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20  ptr. And so on, 
367f0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c  for each.** cell
36800 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49   in the array. I
36810 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
36820 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
36830 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a  aller to ensure.
36840 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61  ** that it is sa
36850 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20  fe to overwrite 
36860 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
36870 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
36880 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ray..**.** When 
36890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
368a0 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61   called, *ppData
368b0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
368c0 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tart of the .** 
368d0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20  content area on 
368e0 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65  page pPg. If the
368f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e   size of the con
36900 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74  tent area is ext
36910 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74  ended,.** *ppDat
36920 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  a is updated to 
36930 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
36940 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f   start of the co
36950 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65  ntent area.** be
36960 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
36970 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61  **.** Finally, a
36980 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70  rgument pBegin p
36990 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74  oints to the byt
369a0 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
369b0 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
369c0 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20  nd of the space 
369d0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73  required by this
369e0 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65   page for the ce
369f0 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
36a00 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c  (for.** all cell
36a10 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f  s - not just tho
36a20 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74  se inserted by t
36a30 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29  he current call)
36a40 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . If the content
36a50 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65  .** area must be
36a60 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66   extended to bef
36a70 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ore this point i
36a80 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d  n order to accom
36a90 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c  odate all.** cel
36aa0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20  ls in apCell[], 
36ab0 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64  then the cells d
36ac0 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f  o not fit and no
36ad0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
36ae0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
36af0 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  t pageInsertArra
36b00 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
36b10 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
36b20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
36b30 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a  add cells to */.
36b40 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20    u8 *pBegin,   
36b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b60 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c    /* End of cell
36b70 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a  -pointer array *
36b80 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c  /.  u8 **ppData,
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ba0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
36bb0 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65  age content -are
36bc0 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  a pointer */.  u
36bd0 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20  8 *pCellptr,    
36be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36bf0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c  * Pointer to cel
36c00 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a  l-pointer area *
36c10 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
36c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
36c40 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 61 64  first cell to ad
36c50 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
36c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36c70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36c80 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
36c90 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c   to pPg */.  Cel
36ca0 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20  lArray *pCArray 
36cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36cc0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
36cd0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
36ce0 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67 2d  u8 *aData = pPg-
36cf0 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 44  >aData;.  u8 *pD
36d00 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20  ata = *ppData;. 
36d10 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72   int iEnd = iFir
36d20 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73  st + nCell;.  as
36d30 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
36d40 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66 73   || pPg->hdrOffs
36d50 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  et==0 );    /* N
36d60 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ever called on p
36d70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69  age 1 */.  for(i
36d80 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b  =iFirst; i<iEnd;
36d90 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73   i++){.    int s
36da0 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a 70  z, rc;.    u8 *p
36db0 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63  Slot;.    sz = c
36dc0 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70 43  achedCellSize(pC
36dd0 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20 69  Array, i);.    i
36de0 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20  f( (aData[1]==0 
36df0 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20  && aData[2]==0) 
36e00 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67 65  || (pSlot = page
36e10 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c  FindSlot(pPg,sz,
36e20 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  &rc))==0 ){.    
36e30 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20    pData -= sz;. 
36e40 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3c 70       if( pData<p
36e50 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e 20 31  Begin ) return 1
36e60 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d 20  ;.      pSlot = 
36e70 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  pData;.    }.   
36e80 20 6d 65 6d 63 70 79 28 70 53 6c 6f 74 2c 20 70   memcpy(pSlot, p
36e90 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
36ea0 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32  ], sz);.    put2
36eb0 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28  byte(pCellptr, (
36ec0 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b  pSlot - aData));
36ed0 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d  .    pCellptr +=
36ee0 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74   2;.  }.  *ppDat
36ef0 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74  a = pData;.  ret
36f00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
36f10 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
36f20 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
36f30 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
36f40 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
36f50 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  Cell .** contain
36f60 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
36f70 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
36f80 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
36f90 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a  tion adds the.**
36fa0 20 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65   space associate
36fb0 64 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c  d with each cell
36fc0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68   in the array th
36fd0 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
36fe0 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69  stored .** withi
36ff0 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50  n the body of pP
37000 67 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65  g to the pPg fre
37010 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c  e-list. The cell
37020 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74  -pointers and ot
37030 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66  her.** fields of
37040 20 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f   the page are no
37050 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  t updated..**.**
37060 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
37070 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
37080 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
37090 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
370a0 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ee-list..*/.stat
370b0 69 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41  ic int pageFreeA
370c0 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20  rray(.  MemPage 
370d0 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
370e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
370f0 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74  to edit */.  int
37100 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20   iFirst,        
37110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37120 46 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65  First cell to de
37130 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lete */.  int nC
37140 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
37150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c            /* Cel
37160 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ls to delete */.
37170 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41    CellArray *pCA
37180 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
37190 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
371a0 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  lls */.){.  u8 *
371b0 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
371c0 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  Pg->aData;.  u8 
371d0 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
371e0 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e  aData[pPg->pBt->
371f0 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75  usableSize];.  u
37200 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74  8 * const pStart
37210 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68   = &aData[pPg->h
37220 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70  drOffset + 8 + p
37230 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  Pg->childPtrSize
37240 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20  ];.  int nRet = 
37250 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
37260 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20  t iEnd = iFirst 
37270 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70  + nCell;.  u8 *p
37280 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Free = 0;.  int 
37290 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66  szFree = 0;..  f
372a0 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69  or(i=iFirst; i<i
372b0 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  End; i++){.    u
372c0 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72  8 *pCell = pCArr
372d0 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  ay->apCell[i];. 
372e0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53     if( pCell>=pS
372f0 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c 70 45  tart && pCell<pE
37300 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nd ){.      int 
37310 73 7a 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20  sz;.      /* No 
37320 6e 65 65 64 20 74 6f 20 75 73 65 20 63 61 63 68  need to use cach
37330 65 64 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72  edCellSize() her
37340 65 2e 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66  e.  The sizes of
37350 20 61 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a   all cells that.
37360 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20        ** are to 
37370 62 65 20 66 72 65 65 64 20 68 61 76 65 20 61 6c  be freed have al
37380 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75  ready been compu
37390 74 69 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64  ting while decid
373a0 69 6e 67 20 77 68 69 63 68 0a 20 20 20 20 20 20  ing which.      
373b0 2a 2a 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72  ** cells need fr
373c0 65 65 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  eeing */.      s
373d0 7a 20 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43  z = pCArray->szC
373e0 65 6c 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28  ell[i];  assert(
373f0 20 73 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69   sz>0 );.      i
37400 66 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c  f( pFree!=(pCell
37410 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20   + sz) ){.      
37420 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
37430 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
37440 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20   pFree>aData && 
37450 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c  (pFree - aData)<
37460 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20  65536 );.       
37470 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67     freeSpace(pPg
37480 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20  , (u16)(pFree - 
37490 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b  aData), szFree);
374a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
374b0 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c     pFree = pCell
374c0 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65  ;.        szFree
374d0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69   = sz;.        i
374e0 66 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64  f( pFree+sz>pEnd
374f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
37500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37510 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b    pFree = pCell;
37520 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20  .        szFree 
37530 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20  += sz;.      }. 
37540 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20       nRet++;.   
37550 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72   }.  }.  if( pFr
37560 65 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ee ){.    assert
37570 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26  ( pFree>aData &&
37580 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29   (pFree - aData)
37590 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72  <65536 );.    fr
375a0 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31  eeSpace(pPg, (u1
375b0 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  6)(pFree - aData
375c0 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a  ), szFree);.  }.
375d0 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
375e0 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d  ../*.** apCell[]
375f0 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f   and szCell[] co
37600 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
37610 74 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20  to and sizes of 
37620 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  all cells in the
37630 0a 2a 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20  .** pages being 
37640 62 61 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63  balanced.  The c
37650 75 72 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67  urrent page, pPg
37660 2c 20 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c  , has pPg->nCell
37670 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a   cells starting.
37680 2a 2a 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69  ** with apCell[i
37690 4f 6c 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c  Old].  After bal
376a0 61 6e 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67  ancing, this pag
376b0 65 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e  e should hold nN
376c0 65 77 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72  ew cells.** star
376d0 74 69 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69  ting at apCell[i
376e0 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  New]..**.** This
376f0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
37700 68 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  he necessary adj
37710 75 73 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20  ustments to pPg 
37720 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61  so that it conta
37730 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
37740 63 74 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62  ct cells after b
37750 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a  eing balanced..*
37760 2a 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46  *.** The pPg->nF
37770 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
37780 61 6c 69 64 20 77 68 65 6e 20 74 68 69 73 20 66  alid when this f
37790 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
377a0 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65   It is the.** re
377b0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
377c0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
377d0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
377e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
377f0 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  itPage(.  MemPag
37800 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
37810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69            /* Edi
37820 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  t this page */. 
37830 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20   int iOld,      
37840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37850 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
37860 73 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c  st cell currentl
37870 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69  y on page */.  i
37880 6e 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20  nt iNew,        
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
378a0 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66  * Index of new f
378b0 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67  irst cell on pag
378c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c  e */.  int nNew,
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20         /* Final 
378f0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
37900 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 43 65 6c  on page */.  Cel
37910 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20  lArray *pCArray 
37920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37930 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 61  Array of cells a
37940 6e 64 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  nd sizes */.){. 
37950 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
37960 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
37970 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
37980 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
37990 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d  ;.  u8 *pBegin =
379a0 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
379b0 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74  nNew * 2];.  int
379c0 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43   nCell = pPg->nC
379d0 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65  ell;       /* Ce
379e0 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50  lls stored on pP
379f0 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61  g */.  u8 *pData
37a00 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  ;.  u8 *pCellptr
37a10 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
37a20 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20   iOldEnd = iOld 
37a30 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70  + pPg->nCell + p
37a40 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  Pg->nOverflow;. 
37a50 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69   int iNewEnd = i
37a60 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66  New + nNew;..#if
37a70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
37a80 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
37a90 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
37aa0 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
37ab0 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ager);.  memcpy(
37ac0 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67  pTmp, aData, pPg
37ad0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37ae0 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
37af0 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72   Remove cells fr
37b00 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  om the start and
37b10 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
37b20 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69   */.  if( iOld<i
37b30 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  New ){.    int n
37b40 53 68 69 66 74 20 3d 20 70 61 67 65 46 72 65 65  Shift = pageFree
37b50 41 72 72 61 79 28 70 50 67 2c 20 69 4f 6c 64 2c  Array(pPg, iOld,
37b60 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 70 43 41 72   iNew-iOld, pCAr
37b70 72 61 79 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76  ray);.    memmov
37b80 65 28 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c  e(pPg->aCellIdx,
37b90 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
37ba0 6e 53 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c  nShift*2], nCell
37bb0 2a 32 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d  *2);.    nCell -
37bc0 3d 20 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20  = nShift;.  }.  
37bd0 69 66 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f  if( iNewEnd < iO
37be0 6c 64 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65  ldEnd ){.    nCe
37bf0 6c 6c 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72  ll -= pageFreeAr
37c00 72 61 79 28 70 50 67 2c 20 69 4e 65 77 45 6e 64  ray(pPg, iNewEnd
37c10 2c 20 69 4f 6c 64 45 6e 64 20 2d 20 69 4e 65 77  , iOldEnd - iNew
37c20 45 6e 64 2c 20 70 43 41 72 72 61 79 29 3b 0a 20  End, pCArray);. 
37c30 20 7d 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61   }..  pData = &a
37c40 44 61 74 61 5b 67 65 74 32 62 79 74 65 4e 6f 74  Data[get2byteNot
37c50 5a 65 72 6f 28 26 61 44 61 74 61 5b 68 64 72 2b  Zero(&aData[hdr+
37c60 35 5d 29 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  5])];.  if( pDat
37c70 61 3c 70 42 65 67 69 6e 20 29 20 67 6f 74 6f 20  a<pBegin ) goto 
37c80 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a  editpage_fail;..
37c90 20 20 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20 74    /* Add cells t
37ca0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
37cb0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  he page */.  if(
37cc0 20 69 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20   iNew<iOld ){.  
37cd0 20 20 69 6e 74 20 6e 41 64 64 20 3d 20 4d 49 4e    int nAdd = MIN
37ce0 28 6e 4e 65 77 2c 69 4f 6c 64 2d 69 4e 65 77 29  (nNew,iOld-iNew)
37cf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  ;.    assert( (i
37d00 4f 6c 64 2d 69 4e 65 77 29 3c 6e 4e 65 77 20 7c  Old-iNew)<nNew |
37d10 7c 20 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f  | nCell==0 || CO
37d20 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
37d30 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e  pCellptr = pPg->
37d40 61 43 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65  aCellIdx;.    me
37d50 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b  mmove(&pCellptr[
37d60 6e 41 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74  nAdd*2], pCellpt
37d70 72 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20  r, nCell*2);.   
37d80 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41   if( pageInsertA
37d90 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20  rray(.          
37da0 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44  pPg, pBegin, &pD
37db0 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20  ata, pCellptr,. 
37dc0 20 20 20 20 20 20 20 20 20 69 4e 65 77 2c 20 6e           iNew, n
37dd0 41 64 64 2c 20 70 43 41 72 72 61 79 0a 20 20 20  Add, pCArray.   
37de0 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61   ) ) goto editpa
37df0 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65  ge_fail;.    nCe
37e00 6c 6c 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a  ll += nAdd;.  }.
37e10 0a 20 20 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76  .  /* Add any ov
37e20 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a  erflow cells */.
37e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67    for(i=0; i<pPg
37e40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b  ->nOverflow; i++
37e50 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  ){.    int iCell
37e60 20 3d 20 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e   = (iOld + pPg->
37e70 61 69 4f 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65  aiOvfl[i]) - iNe
37e80 77 3b 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c  w;.    if( iCell
37e90 3e 3d 30 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65  >=0 && iCell<nNe
37ea0 77 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c  w ){.      pCell
37eb0 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c  ptr = &pPg->aCel
37ec0 6c 49 64 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b  lIdx[iCell * 2];
37ed0 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26  .      memmove(&
37ee0 70 43 65 6c 6c 70 74 72 5b 32 5d 2c 20 70 43 65  pCellptr[2], pCe
37ef0 6c 6c 70 74 72 2c 20 28 6e 43 65 6c 6c 20 2d 20  llptr, (nCell - 
37f00 69 43 65 6c 6c 29 20 2a 20 32 29 3b 0a 20 20 20  iCell) * 2);.   
37f10 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
37f20 20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74    if( pageInsert
37f30 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 20  Array(.         
37f40 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20     pPg, pBegin, 
37f50 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72  &pData, pCellptr
37f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
37f70 65 6c 6c 2b 69 4e 65 77 2c 20 31 2c 20 70 43 41  ell+iNew, 1, pCA
37f80 72 72 61 79 0a 20 20 20 20 20 20 29 20 29 20 67  rray.      ) ) g
37f90 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69  oto editpage_fai
37fa0 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  l;.    }.  }..  
37fb0 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c 73 20  /* Append cells 
37fc0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
37fd0 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c  e page */.  pCel
37fe0 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65  lptr = &pPg->aCe
37ff0 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a  llIdx[nCell*2];.
38000 20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74    if( pageInsert
38010 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70  Array(.        p
38020 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61  Pg, pBegin, &pDa
38030 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20  ta, pCellptr,.  
38040 20 20 20 20 20 20 69 4e 65 77 2b 6e 43 65 6c 6c        iNew+nCell
38050 2c 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c 20 70 43  , nNew-nCell, pC
38060 41 72 72 61 79 0a 20 20 29 20 29 20 67 6f 74 6f  Array.  ) ) goto
38070 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a   editpage_fail;.
38080 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20  .  pPg->nCell = 
38090 6e 4e 65 77 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  nNew;.  pPg->nOv
380a0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
380b0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
380c0 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c  dr+3], pPg->nCel
380d0 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
380e0 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44  aData[hdr+5], pD
380f0 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 0a 23  ata - aData);..#
38100 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
38110 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  UG.  for(i=0; i<
38120 6e 4e 65 77 20 26 26 20 21 43 4f 52 52 55 50 54  nNew && !CORRUPT
38130 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  _DB; i++){.    u
38140 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72  8 *pCell = pCArr
38150 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 2b 69 4e 65  ay->apCell[i+iNe
38160 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  w];.    int iOff
38170 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   = get2byteAlign
38180 65 64 28 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64  ed(&pPg->aCellId
38190 78 5b 69 2a 32 5d 29 3b 0a 20 20 20 20 69 66 28  x[i*2]);.    if(
381a0 20 70 43 65 6c 6c 3e 3d 61 44 61 74 61 20 26 26   pCell>=aData &&
381b0 20 70 43 65 6c 6c 3c 26 61 44 61 74 61 5b 70 50   pCell<&aData[pP
381c0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
381d0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 70 43 65  ze] ){.      pCe
381e0 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c  ll = &pTmp[pCell
381f0 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d   - aData];.    }
38200 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d  .    assert( 0==
38210 6d 65 6d 63 6d 70 28 70 43 65 6c 6c 2c 20 26 61  memcmp(pCell, &a
38220 44 61 74 61 5b 69 4f 66 66 5d 2c 0a 20 20 20 20  Data[iOff],.    
38230 20 20 20 20 20 20 20 20 70 43 41 72 72 61 79 2d          pCArray-
38240 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
38250 28 70 43 41 72 72 61 79 2d 3e 70 52 65 66 2c 20  (pCArray->pRef, 
38260 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
38270 69 2b 69 4e 65 77 5d 29 29 20 29 3b 0a 20 20 7d  i+iNew])) );.  }
38280 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
38290 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 65 64  n SQLITE_OK;. ed
382a0 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f  itpage_fail:.  /
382b0 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74  * Unable to edit
382c0 20 74 68 69 73 20 70 61 67 65 2e 20 52 65 62 75   this page. Rebu
382d0 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61  ild it from scra
382e0 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a  tch instead. */.
382f0 20 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61    populateCellCa
38300 63 68 65 28 70 43 41 72 72 61 79 2c 20 69 4e 65  che(pCArray, iNe
38310 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 72 65 74 75  w, nNew);.  retu
38320 72 6e 20 72 65 62 75 69 6c 64 50 61 67 65 28 70  rn rebuildPage(p
38330 50 67 2c 20 6e 4e 65 77 2c 20 26 70 43 41 72 72  Pg, nNew, &pCArr
38340 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 4e 65 77 5d  ay->apCell[iNew]
38350 2c 20 26 70 43 41 72 72 61 79 2d 3e 73 7a 43 65  , &pCArray->szCe
38360 6c 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a  ll[iNew]);.}../*
38370 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
38380 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
38390 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
383a0 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
383b0 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
383c0 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
383d0 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
383e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
383f0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
38400 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
38410 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
38420 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
38430 6c 61